Scala 为什么单位是Anyval?它在语义上是什么意思?

Scala 为什么单位是Anyval?它在语义上是什么意思?,scala,Scala,在Scala中,为什么单位是Anyval?它在语义上是什么意思?为什么不是Any或Anyref 语义上的区别是什么?选择背后的理性是什么?在scala文档中描述得非常清楚: 。。只有一个Unit类型的值,(),并且它不由底层运行时系统中的任何对象表示。返回类型为Unit的方法类似于声明为void的Java方法 不能有值为null的单位变量 然而,装置可以按照通常的意义装箱: scala> def f[A](a: A) = 42 f: [A](a: A)Int scala> f(()

在Scala中,为什么单位是Anyval?它在语义上是什么意思?为什么不是Any或Anyref


语义上的区别是什么?选择背后的理性是什么?

在scala文档中描述得非常清楚:

。。只有一个Unit类型的值,
()
,并且它不由底层运行时系统中的任何对象表示。返回类型为
Unit
的方法类似于声明为
void
的Java方法


不能有值为
null
的单位变量

然而,装置可以按照通常的意义装箱:

scala> def f[A](a: A) = 42
f: [A](a: A)Int

scala> f(())
res0: Int = 42

scala> :javap -pv -
[snip]
        12: getstatic     #41                 // Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
        15: invokevirtual #45                 // Method $line3/$read$$iw$$iw$.f:(Ljava/lang/Object;)I
同样地

scala> var x: Unit = _
x: Unit = ()
真的是
BoxedUnit.UNIT
在引擎盖下


“unboxed”类型
BoxedUnit.type
Void.type

我不确定这怎么算是非常清楚的,因为它没有提到
Any
AnyVal
AnyRef
?这是前面的句子。要突出显示1)
只有一个类型为
2)
的值未由任何对象表示
。这可以通过使
单元扩展AnyVal来实现
这与Any、AnyRef或AnyVal有什么关系?很明显,单位必须是底部类型,但为什么是底部类型?@adamnfish单位不是底部类型。它与Int类似,只是它只有一个值,
()
。它不能将
null
作为值(比如Int不能是
null
),因此它不能是
null
的超类型<代码>类型[Nothing],那么AnyVal和AnyRef之间的区别是什么?“其中只有一个可以为空?”adamnfish你不必问我
typeOf[Null]谢谢,尽管
错误:未找到:value-typeOf
。我想我的意思是,
AnyVal
AnyRef
之间唯一的区别是什么?长期以来,我一直在努力寻找一个清晰的描述,来解释为什么这些概念在Scala中可见。