Bob*_*sky 3 reflection scala type-erasure
这是我正在尝试做的一个例子:
val ex = List[String]("a", "b", "c")
typePrinter(ex) //prints out "List[String]"
这可能在Scala中吗?标准.getClass
似乎不适用于此.谢谢!
柴坦尼亚的做法是正确的.也就是说,我的理解是在Scala 2.12中ClassTag
并且TypeTag
优先于Manifest
.以下是一种方法TypeTag
:
import scala.reflect.runtime.universe._
def getClassName[T : TypeTag](input: T) : String = {
typeOf[T].toString
}
val ex = List[String]("a", "b", "c")
println(getClassName(ex)) // prints "List[String]"
Run Code Online (Sandbox Code Playgroud)
这样做的原因是类型擦除意味着在运行时,您List
使用泛型参数声明的事实String
根本就不存在了.添加开往上下文ClassTag
或TypeTag
意味着你介绍一个隐含参数ClassTag[T]
或者TypeTag[T]
,该编译器会为你当它遇到的依赖.这些参数对将丢失的类型信息进行编码,并且可以在类似于typeOf
提取类型信息的方法中使用,而不是类实例本身可用的类型信息.