为什么字符串不是值?

max*_*max 2 scala

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)之一不能在表达式中使用或不能传递给函数或从函数返回时,它不是很严格吗?

Sar*_*ngh 5

好吧……在Scala中class可以有伴随对象。

而任何对象的同伴对象class A实际上是的实例A.type

所以...当你这样做时

val i = Int
Run Code Online (Sandbox Code Playgroud)

你得到的是companion objectclass Int是的实例Int.type

请记住,这Int仍然不是价值...您拥有的这东西不是Int。它也不是的实例Int。它是的实例Int.type

但是就String……而言,它被定义为java.lang.StringJava世界中相应名称的别名,因此没有这样的别名companion object。因此,该val分配不适用于它。

至于为什么String不包裹在Scala中。可能有很多原因。但是一个主要原因是因为不需要这样做。

Scala希望具有pure对象层次结构,以便一切都是对象,并从同一根继承Any。Java具有诸如等的基本类型intlong这些基本类型不是对象……这就需要将它们包装为Int