首页 > 解决方案 > 获取常见 AnyVal 类型/基元的 Scala 类型名称

问题描述

在我的 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[_]

标签: scalatypesruntime-type

解决方案


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

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


推荐阅读