スーパークラスが具体的なインスタンスの型にアクセスできるようにするにはどうすればよいでしょうか?
class Base {
val t = typeOf[this.type]
}
class X extends Base {
}
assert((new X).t =:= typeOf[X]) <-- fails!!!
つまり、Base.t はインスタンスの具体的な型を反映する必要があるという考えです...
スーパークラスが具体的なインスタンスの型にアクセスできるようにするにはどうすればよいでしょうか?
class Base {
val t = typeOf[this.type]
}
class X extends Base {
}
assert((new X).t =:= typeOf[X]) <-- fails!!!
つまり、Base.t はインスタンスの具体的な型を反映する必要があるという考えです...
t
メソッドを作成し、それをジェネリックにするのはどうですか。
import scala.reflect.runtime.universe._
class Base {
def myActualType[T <: Base](b: T)(implicit tt: TypeTag[T]) = typeOf[T]
}
class Foo extends Base
class Bar extends Foo
val bar = new Bar
assert(bar.myActualType(bar) =:= typeOf[Bar])
欠点は、呼び出すときに常にオブジェクト参照を送信する必要があることですが、必要なものは得られます。