【问题标题】:Get Scala Type for a java.lang.Class[T] in Scala 2.10在 Scala 2.10 中获取 java.lang.Class[T] 的 Scala 类型
【发布时间】:2013-02-25 13:15:27
【问题描述】:
我正在查看the scala reflection overview,我想知道是否可以将java.lang.Class<T> 用作Scala 2.10 中的类型。
import scala.reflect.runtime.{ universe => ru }
class Reflector {
def getType: ru.Type = {
ru.typeOf[java.lang.String]
}
def getType[T](clazz: Class[T]): ru.Type = {
//is it possible to implement me?
}
}
是否可以在不更改其签名的情况下实现parse[T](clazz: Class[T]): ru.Type 方法以便能够使用new Reflector().parse(String.class) 从java 调用它?
【问题讨论】:
标签:
scala
reflection
scala-java-interop
【解决方案1】:
你可以这样实现你的方法:
def getType[T](clazz: Class[T])(implicit runtimeMirror: ru.Mirror) =
runtimeMirror.classSymbol(clazz).toType
然后这样称呼它:
implicit val mirror = ru.runtimeMirror(getClass.getClassLoader)
getType(classOf[String])
您可能对smirror library 感兴趣,因为它包含类似的方法
def sClassOf[T](clazz: Class[T])(implicit runtimeMirror: Mirror): SClass[T]
其中SClass 包含typ 属性。
编辑
您可能希望将方法更改为此(这将保持相同的签名)
def getType[T](clazz: Class[T]):ru.Type = {
val runtimeMirror = ru.runtimeMirror(clazz.getClassLoader)
runtimeMirror.classSymbol(clazz).toType
}