如何让超类可以访问其具体实例的类型?
class Base {
val t = typeOf[this.type]
}
class X extends Base {
}
assert((new X).t =:= typeOf[X]) <-- fails!!!
所以,想法是Base.t应该反映实例的具体类型......
答案 0 :(得分:2)
不幸的是,this.type
是一个常见的误解:它不是实例的类,它是单例类型(即只有一个成员的类型:{ {1}})。它没有继承就不会工作。
this
答案 1 :(得分:0)
如何使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])
缺点是你在调用它时总是要发送对象引用,但是你得到了你想要的东西。