[英]Why null was called “a subtype of every reference type”?
我认为这只是意味着您可以将空引用分配给任何引用类型。 它并没有让我想到这种非常有用的方法。
Java语言规范对空类型(在4.1节中 )说了这句话:
还有一个特殊的null类型,即表达式null的类型,它没有名称。 由于空类型没有名称,因此无法声明空类型的变量或将其强制转换为空类型。 空引用是空类型表达式的唯一可能的值。 空引用始终可以转换为任何引用类型。 在实践中,程序员可以忽略null类型,而假装null只是可以是任何引用类型的特殊文字。
类型形成部分顺序,即对于程序中所有类型集中的任何两个类型,它们之间可能都有关系(即T1 < T2
T2在某种意义上是T1的子类型)。 不相关的类层次结构中的事物未定义此类关系。
那么,基本上,这告诉您的是那组类型的所有成员? extends T
? extends T
描述的值小于T
且大于null
。 null作为所有内容的子类型存在,因为将null
值分配给引用始终是有效的。
更正式地:
∀x ∈ ? extends T. null ≥ x ≥ T
从这篇有趣的文章中摘录:
Java具有null类型。 在JLS3之前的版本中,空类型不是正式的任何类型的子类型,并且空引用不是形式上除空类型之外的任何形式的值。 出于实用原因,一项法令将空引用强制转换为任何引用类型。 (这类似于使List可分配给List形式参数的法令,即使List不是List的子类型。您也知道该法令是捕获转换。)JLS3将空类型定义为每种类型的子类型,因此看起来像Bottom这样的可怕。
这意味着null可以是任何类型。
您可能有Animal
类和子类Dog
。 如果您有一个类型为Animal
的变量,其值为null
,则无法确定该null
是Animal
类型还是Dog
类型。 两者同等有效。
null instanceof T
对于任何T类型都是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.