3

我正在查看scala 反射概述,我想知道是否可以java.lang.Class<T>在 Scala 2.10 中使用 a 作为类型。

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方法以便能够从 java 调用它new Reflector().parse(String.class)

4

1 回答 1

7

您可以像这样实现您的方法:

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 库感兴趣,因为它包含类似的方法

def sClassOf[T](clazz: Class[T])(implicit runtimeMirror: Mirror): SClass[T]

whereSClass包含一个typ属性。


编辑

您可能希望将方法更改为此(这将保持相同的签名)

def getType[T](clazz: Class[T]):ru.Type = {
  val runtimeMirror =  ru.runtimeMirror(clazz.getClassLoader)
  runtimeMirror.classSymbol(clazz).toType
}
于 2013-02-25T13:48:10.533 回答