を使用していないが、私はこのようなコンパニオンオブジェクトにいくつかの暗黙の値を取得し、いくつかのコードを書いた:インポート暗黙のコンパニオンオブジェクトからの値が、
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は暗黙の値を見つけることができませんか?
なぜ私は彼らのポジションを入れ替えるとできますか?