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

时间:2010-08-16 17:38:45

标签: java generics null

伙计们,任何人都可以对我在this book中遇到的短语给出合乎逻辑的解释:

  

您可能会发现将? extends T视为包含以下null类型和T类型所限定的区间中的每种类型(其中类型为null是每种参考类型的子类型。)。

感谢。

5 个答案:

答案 0 :(得分:4)

我认为这只是意味着您可以将null引用分配给任何引用类型。它并没有让我觉得这是一种非常有用的思考方式。

Java语言规范有关空类型(section 4.1):

的说法
  

还有一个特殊的null类型   表达式的类型为null,具有   无名。因为null类型没有   名字,不可能申报   null类型的变量或者要转换   到null类型。空引用   是唯一可能的价值   null类型的表达式。 null   引用总是可以转换为任何引用   参考类型。在实践中,   程序员可以忽略null类型   并假装null只是一个   可以是任何特殊文字   参考类型。

答案 1 :(得分:2)

类型形成部分顺序,即对于程序中所有类型集合中的任何两种类型,它们之间可能存在关系(即T1 < T2 - T2在某种意义上是T1的子类型)。不相关的类层次结构中的事物没有定义这样的关系。

所以基本上告诉你的是? extends T描述的那组类型的所有成员都小于T且大于null。 null作为所有内容的子类型存在,因为将值null赋给引用始终有效。

更正式:

∀x ∈ ? extends T. null ≥ x ≥ T

答案 2 :(得分:2)

来自this interesting article,摘录:

  

Java具有null类型。 Pre-JLS3 ,.   null类型不是正式的   任何类型的子类型,以及null   参考不是正式的价值   除null类型之外的任何类型。一个   法令提出了空引用   可转换为任何引用类型   务实的原因。 (这类似于   制定名单的法令   可分配给正式的List   参数即使List不是a   列表的子类型。你知道   法令作为捕获转换。)JLS3   将null类型定义为的子类型   各种类型,所以它看起来很糟糕   像Bottom。

答案 3 :(得分:0)

这意味着null可以是任何类型。

您可能有一个类Animal,其子类为Dog。 如果您的Animal类型的变量的值为null,则无法判断nullAnimal类型还是类型Dog。两者都同样有效。

答案 4 :(得分:-1)

null instanceof T

适用于任何类型的T。