如何在scala的特征中进行子类反射

时间:2018-04-18 05:47:20

标签: scala

import scala.reflect.runtime.{universe => ru}

trait someTrait{
  def getType[T: ru.TypeTag](obj: T) = ru.typeOf[T]
  def reflect()={
       println(getType(this))  // got someTrait type, not A type.
    }
}

class A extends someTrait{

}

main(){
   new A().reflect()
}

当我运行main函数时,我打印出 someTrait 类型。 如何在反映功能中获得 A 类型?

1 个答案:

答案 0 :(得分:2)

使用TypeTagClassTag,您无法在每个子类型中执行额外的工作,如Ramesh的答案所做的那样。因为编译器仅基于静态类型插入它们。

当它看到getType(this)时,它首先将类型参数推断为getType[someTrait](this),然后变为getType[someTrait](this)(typeTag[someTrait])。您可以看到A从未被视为且无法

  

正如scala文档所说,我们不能使用java reflectoin,因为它可能会导致问题。

不,Scala文档肯定不会说您不能使用Java反射来实现此。您需要了解其局限性,但Scala反射完全相同。