在子类中获取typeOf [this.type]

时间:2015-09-08 09:10:23

标签: scala scala-reflect

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

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

class X extends Base {
}

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

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

2 个答案:

答案 0 :(得分:2)

不幸的是,this.type是一个常见的误解:它不是实例的类,它是单例类型(即只有一个成员的类型:{ {1}})。它没有继承就不会工作。

可以使用F-bounded polymorphism

完成此操作
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])

缺点是你在调用它时总是要发送对象引用,但是你得到了你想要的东西。