繁体   English   中英

获取Scala类型的Java反射表示

[英]Get Java reflection representation of Scala type

这似乎是一个简单的问题,但搜索非常具有挑战性,因此我提出了一个新问题。 如果已经被问到,我道歉。

由于此处描述的编译器错误Scala 2.11.5编译器崩溃了类型别名和清单 (也在这里https://issues.scala-lang.org/browse/SI-9155 ),我需要使用scala TypeTag和朋友发现方法的类型参数。 但是,我需要在使用java.lang.Classjava.lang.reflect.Type的Java库中使用该类型信息。

如何将scala.reflect.runtime.universe Type转换为java.lang.reflect.Typejava.lang.Class

具体来说,我将如何填写此方法的正文:

def typeFor[T](implicit tag: TypeTag[T]): java.lang.reflect.Type = ...

或者,如果那不可能:

def typeFor[T](implicit tag: TypeTag[T]): java.lang.Class[T] = ...

请注意,由于上面发布的错误,我不能使用scala.reflect.Manifest

简短的回答是否定的,但你可以尝试做类似于这个问题的事情。 但是有一张门票......

这可能有一些我不知道的限制,但你可以下载到Java反射并尝试类似的东西:

import scala.util.control.Exception._

def typeMe[T](implicit t: TypeTag[T]) = {
  catching(classOf[Exception]) opt Class.forName(t.tpe.typeSymbol.asClass.fullName)
}

println(typeMe[String])
println(typeMe[ClassTag[_]])

结果是:

Some(class java.lang.String)
Some(interface scala.reflect.ClassTag)

我用清单解决它的方式是:

  private def typeFromManifest(m: Manifest[_]): Type = {
if (m.typeArguments.isEmpty) { m.runtimeClass }
else new ParameterizedType {
  def getRawType = m.runtimeClass
  def getActualTypeArguments = m.typeArguments.map(typeFromManifest).toArray
  def getOwnerType = null
}

}

现在我正在尝试使用Manifest之外的其他东西来解决这个问题,而这些东西应该从scala运行时中删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM