ジェネリック型の暗黙のパラメータにアクセスしようとしています。 Scalaは明示的なジェネリック型(例えば、printGenericType[Person]
)を持つメソッドを以下のように呼び出すことで、単純な場合でも暗黙的に罰金を見つけることができます。実行時に明示的に暗黙のパラメータにアクセスする
ただし、TypeTag[Person]
を作成してprintGenericTypeGivenTypeTag
に渡すと、Scalaは暗黙的なパラメータを見つけることができません。私が正しく理解していれば
case class Person(name: String)
case class Animal(age: Int)
implicit val p = Person("cory")
implicit val a = Animal(2)
def main(args: Array[String]): Unit = {
// Can find the implicit Person, prints "Hello Person(cory)"
printGenericType[Person]
// Can find the implicit Animal, prints "Hello Animal(2)"
printGenericType[Animal]
// See comment below
printNamedType("Person")
printNamedType("Animal")
}
def printGenericType[T](implicit t: T) = {
println(s"Hello $t")
}
def printGenericTypeGivenTypeTag[T](typeTag: TypeTag[T])(implicit t: T) = {
println(s"Hello $t")
}
def printNamedType[T](name: String) = {
val typetag: TypeTag[T] = getTypeTag[T](name)
// Cannot find the implicit of type T, compiler error
printGenericTypeGivenTypeTag(typetag)
}
def getTypeTag[T](name:String): TypeTag[T] = ... //Implementation irrelevant
は、Scalaはコンパイル時に暗黙のパラメータを見つけ、それはそれはコンパイル時にジェネリック型T
のための暗黙のパラメータを見つけることができないという意味になります。
しかし、私はT
の暗黙のインスタンスが存在することを知っています。 T
の暗黙の値を見つけるようにprintGenericTypeGivenTypeTag
を書き換えることはできますか?実行時には、このメソッドは実際のタイプのT
にアクセスできるため、スコープ内にある同じタイプの暗黙のパラメータを見つけることができるようです。好奇心のために
は、この背後にある理由は、これを避けるためです:
name match {
case "Person" => printGenericType[Person]
case "Animal" => printGenericType[Animal]
}