【问题标题】:Get Scala type name for common AnyVal types/primitives获取常见 AnyVal 类型/基元的 Scala 类型名称
【发布时间】:2019-09-10 15:39:03
【问题描述】:

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

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

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


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

【问题讨论】:

    标签: scala types runtime-type


    【解决方案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)。

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2013-11-29
      • 2010-11-25
      相关资源
      最近更新 更多