【问题标题】: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
    }
    

    【讨论】:

    • 我已编辑答案以符合 OP 的“不更改其签名”要求
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多