获取常见AnyVal类型/基元的Scala类型名称

时间:2019-04-20 20:40:28

标签: scala types runtime-type

在我的Scala代码中,我有一个utf16实例,例如从Class[_ <: AnyVal]获得的实例。

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

如果我要处理的是Java原语等效项或默认的盒装Java等效项(例如"int"),如何从Class变量中获取scala类型名称


万一您想知道为什么我会需要这个;我正在使用treehugger生成一些scala代码,以及有关是否需要生成例如java.lang.Integer来自提供scala.Int

的库

1 个答案:

答案 0 :(得分:1)

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

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

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

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)。