为什么" Float"的simpleName?实际上"漂浮"?

时间:2015-10-13 00:43:56

标签: scala

String的simpleName字面意思是"字符串":

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'但我得到了“厌恶”#39; - 为什么SimpleName行为与REPL中对象的表示不一致?

奖励积分 - 有没有办法可以恢复我最初使用的类型的确切名称,而不需要任何繁琐的映射?什么方法是REPL调用对象来获得它的正确名称(使用国会大厦F)。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

  

REPL调用对象以获得正确的名称(使用国会大厦F)是什么方法。

它不会在对象上调用任何方法;如果确实如此,它就不能为同一个对象显示两种不同的类型:

scala> val x = ""
res1: String = ""

scala> val y: Object = x
res2: Object = x

使用编译器有关可以使用TypeTags访问的类型的信息作为som-snytt的答案显示。