2017-04-05 10 views
0

を使用していないが、私はこのようなコンパニオンオブジェクトにいくつかの暗黙の値を取得し、いくつかのコードを書いた:インポート暗黙のコンパニオンオブジェクトからの値が、

package example.implicits 

class Test { 
    import Test.GetValue 
    import Test.Implicits._ 

    val intV = getV[Int] 
    val stringV = getV[String] 

    private def getV[T](implicit getV: GetValue[T]): T = getV.value 
} 

object Test { 
    trait GetValue[T] { 
    def value: T 
    } 

    object Implicits { 
    implicit val intValue = new GetValue[Int] { 
     def value = 10 
    } 

    implicit val stringValue = new GetValue[String] { 
     def value = "ten" 
    } 
    } 
} 

コードのこの作品は、コンパイルすることができないと、コンパイラはそれはcouldn文句必要な暗黙の値を見つける。私は明示的にこれらの値を使用する場合は、何もうまくいかない

のJava 1.8.0_66、私の環境では、Java HotSpot(TM)64ビットサーバーVM上

スカラ座2.11.8であることに注意してください:

class Test { 
    import Test.GetValue 
    import Test.Implicits._ 

    implicit val intValue1 = intValue 

    implicit val stringValue1 = stringValue 

    val intV = getV[Int] 
    val stringV = getV[String] 

    private def getV[T](implicit getV: GetValue[T]): T = getV.value 
} 

E:私は以下のように、新しい暗黙の値を宣言した場合

class Test { 
    import Test.GetValue 
    import Test.Implicits._ 

    val intV = getV[Int](intValue) 
    val stringV = getV[String](stringValue) 

    private def getV[T](implicit getV: GetValue[T]): T = getV.value 
} 

さらにより、あいまいな暗黙の値のためにエラーが発生します。

私はクラスTestとオブジェクトテストの位置を交換すると、すべてが右に行く:

object Test { 
    trait GetValue[T] { 
    def value: T 
    } 

    object Implicits { 
    implicit val intValue = new GetValue[Int] { 
     def value = 10 
    } 

    implicit val stringValue = new GetValue[String] { 
     def value = "ten" 
    } 
    } 
} 

class Test { 
    import Test.GetValue 
    import Test.Implicits._ 

    val intV = getV[Int] 
    val stringV = getV[String] 

    private def getV[T](implicit getV: GetValue[T]): T = getV.value 
} 

私はすでに最初のケースでそれらをインポートした後に、なぜScalaは暗黙の値を見つけることができませんか?

なぜ私は彼らのポジションを入れ替えるとできますか?

答えて

2

getV[Int]に暗黙的に解決された時点で、コンパイラはTest.intValueの型をまだ推測していないからです。

Test.intValueTest.stringValueを明示的に指定すれば、問題は解決します。

暗黙の定義には、特にこの種の動作を避けるために、明示的な型を指定する必要があります(申し訳ありませんが、正確な場所は覚えていません)。

関連する問題