scala> val a = Int
a: Int.type = object scala.Int
scala> val a = String
<console>:11: error: object java.lang.String is not a value
val a = String
^
Run Code Online (Sandbox Code Playgroud)
为什么scala不会java.lang.String为了创造String价值而在周围创建薄包装纸?当主要类型(String)之一不能在表达式中使用或不能传递给函数或从函数返回时,它不是很严格吗?
好吧……在Scala中class可以有伴随对象。
而任何对象的同伴对象class A实际上是的实例A.type。
所以...当你这样做时
val i = Int
Run Code Online (Sandbox Code Playgroud)
你得到的是companion object的class Int是的实例Int.type
请记住,这Int仍然不是价值...您拥有的这东西不是Int。它也不是的实例Int。它是的实例Int.type。
但是就String……而言,它被定义为java.lang.StringJava世界中相应名称的别名,因此没有这样的别名companion object。因此,该val分配不适用于它。
至于为什么String不包裹在Scala中。可能有很多原因。但是一个主要原因是因为不需要这样做。
Scala希望具有pure对象层次结构,以便一切都是对象,并从同一根继承Any。Java具有诸如等的基本类型int,long这些基本类型不是对象……这就需要将它们包装为Int。