これは私ができる最高のものです。それは私が望む真のランタイム型情報をキャプチャしませんが、コンパイル時に少なくとも使用時点で既知の型情報をキャプチャします:
import scala.reflect.runtime.universe._
trait Lover {
def love[ T : TypeTag ]( amour : T ) : String;
}
class TypedLover[MY_TYPE : TypeTag] {
def love[ T : TypeTag ]( amour : T ) : String =
if ( implicitly[TypeTag[T]].tpe <:< implicitly[TypeTag[MY_TYPE]].tpe )
"You are totally my type."
else
"Nope, sorry, not my type."
}
仕組みは次のとおりです。
scala> val intLover = new TypedLover[Int]
intLover: TypedLover[Int] = TypedLover@2d4cadc4
scala> intLover.love(7)
res2: String = You are totally my type.
scala> intLover.love("Hello")
res3: String = Nope, sorry, not my type.
scala> val stringLover = new TypedLover[String]
stringLover: TypedLover[String] = TypedLover@1f7c9157
scala> stringLover.love(7)
res4: String = Nope, sorry, not my type.
scala> stringLover.love("Hello")
res5: String = You are totally my type.
ただし、実際のランタイム型情報を取得できない理由は次のとおりです。
scala> val stringInAnyRef : Any = "Hello"
stringInAnyRef: Any = Hello
scala> stringLover.love( stringInAnyRef )
res7: String = Nope, sorry, not my type.
完璧ではありませんが、これまでで最高です。