繁体   English   中英

为什么将null称为“每个引用类型的子类型”?

[英]Why null was called “a subtype of every reference type”?

伙计们,任何人都可以对我在本书中遇到的句话进行合乎逻辑的解释:

您可能会觉得有帮助? extends T ? extends T为包含每个类型,并在一定? extends T包含一个以下类型的null ,该间隔受以下null类型的约束和上方T约束(其中null类型是每个引用类型的子类型 )。

谢谢。

我认为这只是意味着您可以将空引用分配给任何引用类型。 它并没有让我想到这种非常有用的方法。

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 ,则无法确定该nullAnimal类型还是Dog类型。 两者同等有效。

null instanceof T

对于任何T类型都是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM