2012-03-07 25 views
6

ここでは、私が遭遇したものの単純化しています。これは、コンパイルされます。宣言と宣言の順序

trait A { implicit val x = 1 } 
trait B extends A { val y = implicitly[Int] } 

これはいませんが(暗黙の値を見つけることができませんでした):

trait B extends A { val y = implicitly[Int] } 
trait A { implicit val x = 1 } 

私は自己のタイプを指定することによって、私の意思を明確にしてみました:trait A { this: B => ... }が、無駄に。

コードの配置方法を気にせずにこの種の依存関係を処理するにはどうすればよいですか?

答えて

11

あなたは、少なくとも暗黙の可視性のためのルールは、その型が明示的か宣言されているかどうか異なり、後者1

trait B extends A { val y = implicitly[Int] } 
trait A { implicit val x : Int = 1 } 

のために、明示的に型を宣言する必要があります。そうでない場合は、宣言のポイントの後でのみ、暗黙的に(暗黙的に)使用できます。

型が宣言されていない場合(再帰ルーチンのように)型推論が難しくなる可能性があるためです。多くの場合、推論は(あなたのコードのように)簡単ですが、仕様は明確にする必要があります。

+0

暗黙オブジェクトはどうですか?私は、暗黙のうちに解決の仕方について私にスペックの部分を指摘できますか? '形質X;形質BはAを拡張する{val y =暗黙的に[X]};特性A {暗黙のオブジェクトxはXを伸ばす} ' – elbowich

+1

遅れて申し訳ありません。スペックの大雑把な外観の後、私はルールを見つけることができませんでした。しかし、[このバグ報告](https://issues.scala-lang.org/browse/SI-801)で述べられているように、実装のように見えますが、まだ仕様に達していません。暗黙的なオブジェクトではうまくいかない理由は分かりません。 –

関連する問題