I 1つの形質及び2つのオブジェクトがある場合:Scalaでは、すべてのサブクラスで実装された抽象型のClassTagを参照する方法は?
trait MyClass {
type T <: MyClass
def foo(): ClassTag[T] = {...}
}
object ChildClass1 extends MyClass {
type T = String
}
object ChildClass2 extends MyClass {
type T = Option[String]
}
それはFOOを実現することができる()MyClassの中、ChildClass1.foo()はClassTag [文字列]を得、及びChildClass2.foo()はClassTagを生成するように[オプション]。
もしそうでない場合、それを迂回する最も簡単な方法は何ですか? Tの実装は内部クラス/オブジェクトなので、ハッキングの反映にはいくつかの副作用があることに注意してください。
lazy val mf: ClassTag[T] = {
val clazz = this.getClass
val name = clazz.getName
val modifiedName = name + "T"
val reprClazz = Utils.classForName(modifiedName)
Manifest.classType(reprClazz)
}
サブクラスはシングルトンオブジェクトである場合にのみ動作します:
最初に反射が必要なのはなぜですか? Scalaでは、通常、その周りに道があります。 – Reactormonk
はい、コンパイラが既に知っているべきことを繰り返すために、より冗長で不必要な方法です。 – tribbloid