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)。
答案 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
使用编译器有关可以使用TypeTag
s访问的类型的信息作为som-snytt的答案显示。