1

在我的 scala 代码中,我有一个Class[_ <: AnyVal]实例,例如从classOf[Int].

当我尝试从此(使用classOf[Int].getName)获取 scala 类型名称时,我期待看到"scala.Int",但我得到的是原始 Java 类型的名称:"int"

如何从我的Class变量中获取 scala 类型名称,以防我处理 java 原始等效项或默认的盒装 java 等效项(例如java.lang.Integer


如果您想知道我为什么需要这个;我正在使用treehugger生成一些scala代码,关于我是否需要生成例如a的信息scala.Int来自提供a的库Class[_]

4

1 回答 1

1

如果您只想处理原始类型,

def scalaName(cls: Class[_]) = 
  if (cls.isPrimitive) s"scala.${cls.getName.capitalize}" else cls.getName

不幸的是,Java 标准库并没有(据我所知)提供一种在盒装和原始Classes 之间进行转换的方法,因此最好的方法是单独处理它们:

val classesMap = Map[Class[_], Class[_]](
  classOf[java.lang.Integer] -> classOf[Int], 
  classOf[java.lang.Short] -> classOf[Short], 
  ...
)

def scalaName1(cls: Class[_]) = scalaName(classesMap.getOrElse(cls, cls))

您可能还想Void.TYPE专门处理(例如转换为scala.Unit)。

于 2019-04-20T21:44:35.470 回答