为什么String不是值?

时间:2016-12-31 17:09:48

标签: 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
               ^

为什么scala不会在java.lang.String周围创建一个瘦包装,以使String成为值?当其中一个主要类型(String)无法在表达式中使用或传递给函数/从函数返回时,这不是非常严格吗?

2 个答案:

答案 0 :(得分:5)

嗯......在Scala class中可以有伴侣对象。

任何class A的伴随对象实际上都是A.type的实例。

所以...当你这样做时,

val i = Int

你得到的是companion object class Int Int.type的实例Int

请注意Int仍然不是一个价值......你拥有的东西不是Int。它也不是Int.type的实例。它是String

的一个实例

但就java.lang.String而言......它被定义为来自Java世界的相应companion object的别名,因此没有val。因此String赋值不适用于它。

至于为什么pure没有包含在Scala中。这可能有很多原因。但一个主要原因是因为没有必要这样做。

Scala希望拥有Any对象层次结构,以便所有内容都是对象,并从同一个根int继承。 Java有longInt等基本类型......它们不是对象......这就需要将它们包装到require中。

答案 1 :(得分:0)

虽然这个问题可能会让人误解了一个类型,但下面提示为什么你可以选择Java静态,就好像它们是伴随对象的成员一样,即使没有这样的对象:

$ scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.

scala> java.lang.System.currentTimeMillis
res0: Long = 1483263161912

scala> java.lang.System
<console>:12: error: object java.lang.System is not a value
       java.lang.System
                 ^

scala> java.lang.System.toString
<console>:12: error: value toString is not a member of object System
Note that System extends Any, not AnyRef.
Such types can participate in value classes, but instances
cannot appear in singleton types or in reference comparisons.
       java.lang.System.toString
                        ^

scala>