【问题标题】:Why is the simpleName for "Float" actually "float"?为什么“Float”的 simpleName 实际上是“float”?
【发布时间】:2015-10-13 00:43:56
【问题描述】:

String 的 simpleName 字面意思是“String”:

scala> "abc".getClass.getSimpleName
res0: String = String

这是有道理的,该类型的 simpleName 与我一开始用来组合的名称相同,但请考虑 Float:

scala> 32.2f
res4: Float = 32.2

scala> 23.2f.getClass.getSimpleName
res3: String = float

我期待 'Float' 但我得到了 '[f]loat' - 为什么 SimpleName 行为与 REPL 中的对象表示不一致?

加分 - 有没有一种方法可以恢复我最初使用的类型的确切名称,而无需任何繁琐的映射? REPL 调用对象以获取正确名称的方法是什么(使用大写字母 F)。

【问题讨论】:

  • 对于AnyVal(盒装原语)类型,简单名称是未装箱值的名称——“float”表示未装箱Float。
  • @Shadowlands AnyVal 值不一定是装箱的。这就是它存在的原因。

标签: scala


【解决方案1】:

Scala 类型:

scala> import reflect.runtime._, universe._
import reflect.runtime._
import universe._

scala> def f[A](a: A)(implicit t: TypeTag[A]) = t
f: [A](a: A)(implicit t: reflect.runtime.universe.TypeTag[A])reflect.runtime.universe.TypeTag[A]

scala> f(2.0)   // typeTag[Double]
res1: reflect.runtime.universe.TypeTag[Double] = TypeTag[Double]

scala> res1.tpe
res2: reflect.runtime.universe.Type = Double

scala> res2.typeSymbol.name
res3: reflect.runtime.universe.Symbol#NameType = Double

盒装区别严格来说是底层平台的产物。

scala> java.lang.Float.TYPE
res4: Class[Float] = float

scala> classOf[java.lang.Float]
res5: Class[Float] = class java.lang.Float

【讨论】:

    【解决方案2】:

    REPL 调用对象的什么方法来获取它的正确名称(使用大写字母 F)。

    它没有在对象上调用任何方法;如果是这样,它就不能为同一个对象显示两种不同的类型:

    scala> val x = ""
    res1: String = ""
    
    scala> val y: Object = x
    res2: Object = x
    

    它使用编译器关于类型的信息,可以使用TypeTags 访问,如 som-snytt 的回答所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多