我几乎可以肯定,这个问题之前已经被问过了,但我错过了正确的词语来找到它。为什么Scala偶尔会回退到Java对象?
scala> Seq[Any](3, 3.4)
res0: Seq[Any] = List(3, 3.4)
scala> res0(1).getClass
res1: Class[_] = class java.lang.Double
scala> Seq(3, 3.4)
res2: Seq[Double] = List(3.0, 3.4)
scala> res2(1).getClass
res3: Class[Double] = double
为什么斯卡拉处理我Double
输入为java.lang.Double
一个Seq[Any]
内,但它一直为scala.Double
与Seq[AnyRef]
工作时?有没有办法来防止这种行为,而是总是使用Scala类型?
但是,例如'3'的文字是'Int <:AnyVal <:Any'。我一直在问的是'Seq [Any]'。所以乍一看,维护Scala类型不应该是一个问题。为什么拳击变得必要? – Taig
@泰格拳击是需要的,因为集合在对象上工作。 Scala试图隐藏存在原始类型和对象的事实,但在JVM级别上,这种区别确实存在。由于Scala在JVM上运行,因此受到此限制。它试图隐藏它,但并不总是可以的。 JVM没有'AnyVal'的等价物,因此在集合中,层次结构只看起来像'java.lang.Integer <:Object'。 –