获取一个java.lang.Class中的[T]斯卡拉Type在斯卡拉2.10(Get Scala

2019-08-17 03:43发布

我看阶反射概述 ,我想知道如果它是可以使用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无需更改其签名,以便能够从Java调用它的方法new Reflector().parse(String.class)

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

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
}


文章来源: Get Scala Type for a java.lang.Class[T] in Scala 2.10