2

如何让超类访问其具体实例的类型?

class Base {
  val t = typeOf[this.type]
}

class X extends Base {
}

assert((new X).t =:= typeOf[X]) <-- fails!!!

所以,这个想法是 Base.t 应该反映实例的具体类型......

4

2 回答 2

2

不幸的是,这是一个常见的误解this.type:它不是实例的类,而是单例类型(即只有一个成员的类型:this)。没有继承也行不通。

这可以使用F 有界多态性来完成:

class Base[A <: Base[A] : TypeTag] {
  val t = typeOf[A]
}

class X extends Base[X]
于 2015-09-08T11:39:12.917 回答
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])

缺点是当你调用它时你总是必须发送对象引用,但你得到了你想要的。

于 2015-12-16T11:16:56.817 回答