如何让超类访问其具体实例的类型?
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 应该反映实例的具体类型......
不幸的是,这是一个常见的误解this.type
:它不是实例的类,而是单例类型(即只有一个成员的类型:this
)。没有继承也行不通。
这可以使用F 有界多态性来完成:
class Base[A <: Base[A] : TypeTag] {
val t = typeOf[A]
}
class X extends Base[X]
如何制作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])
缺点是当你调用它时你总是必须发送对象引用,但你得到了你想要的。