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 类型?
答案 0 :(得分:2)
使用TypeTag
或ClassTag
,您无法在每个子类型中执行额外的工作,如Ramesh的答案所做的那样。因为编译器仅基于静态类型插入它们。
当它看到getType(this)
时,它首先将类型参数推断为getType[someTrait](this)
,然后变为getType[someTrait](this)(typeTag[someTrait])
。您可以看到A
从未被视为且无法。
正如scala文档所说,我们不能使用java reflectoin,因为它可能会导致问题。
不,Scala文档肯定不会说您不能使用Java反射来实现此。您需要了解其局限性,但Scala反射完全相同。