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
)无法在表达式中使用或传递给函数/从函数返回时,这不是非常严格吗?
答案 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有long
,Int
等基本类型......它们不是对象......这就需要将它们包装到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>