2010-08-16 62 views
2

伙计们,可以在任何一个给我this book遇到短语的合乎逻辑的解释:为什么null被称为“每个引用类型的子类型”?

您可能会发现它有助于想到? extends T为包含在间隔每一种类型的下面和null类型北临T以上(其中null的类型是每个参考类型的子类型)。

谢谢。

+0

虽然不是你询问的部分,但我不确定我是否喜欢“下面的null类型和下面的T类型的区间”。因为'null'可以被转换为* any *类型的引用,所以我觉得它比'T'更不“特定”,这会使间隔变得有点怪异......我想我只是在挑剔虽然我自己的(可能有数学上的缺陷)解释的基础。 :P – 2010-08-16 17:54:31

+0

@Tim:蒂姆,我完全同意你的这个相当直观的逻辑,因为他说“作为一个子类,”让我具体和实际使用+类型层次和面向对象的东西的不动产的事......看贴的一篇文章通过@JRL – Max 2010-08-16 18:00:08

回答

4

我认为这只是意味着您可以将空引用分配给任何引用类型。这并不意味着我是一个非常有帮助的思考方式。

Java语言规范有这样说的空类型(section 4.1):

还有一个特殊的空类型, 型表达空,其中有 没有名字的。由于空类型没有 名称,因此无法声明空类型的 变量或将 转换为空类型。空引用 是空类型的 表达式的唯一可能值。无效 引用可以始终转换为任何 引用类型。在实践中,程序员可以忽略空类型 ,只是假装null仅仅是一个 特殊字面值,它可以是任何 引用类型。

+1

所以,这里的关键词是'空引用总是可以转换为任何引用type',这要求'空的类型是每一个参考type'的亚型是什么原因使auhthor。奇怪的一个:)谢谢指出这一点。 – Max 2010-08-16 17:50:15

+0

这是一种有用的思维方式,因为它告诉你Java的类型系统不健全,反过来使它几乎没用。 – 2010-08-16 20:40:55

0

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

您可能有一个类AnimalDog的子类。 如果您有一个类型为Animal的变量,其值为null您不能确定nullAnimal类型还是Dog类型。两者同样有效。

+0

我认为这是一个有点欺骗性的陈述。值'null'总是只有一种类型 - 'null'类型。它不能是“任何类型”。类型系统定义了类型'null'(它只被'null'值居住)成为所有引用类型的子类型。在你的例子中,这好像你有一个隐含的'null'类被定义为'Animal'的子类,因此将值'null'(这个'null'类的一个实例)赋值是有效的,到“动物”类型的变量。 – Gian 2010-08-16 17:56:59

-1
null instanceof T 

为任何类型T

+0

'System.out.println(null instanceof Object);''false''怎么样? – Max 2010-08-16 17:45:56

+0

这完全不正确。 Java创作者竭尽全力让这种情况始终为假 – 2010-08-16 17:47:44

+0

我很尴尬。我只是假设! – Ladlestein 2010-08-16 18:48:57

2

类型形成一个偏序,在程序集合中的所有类型的,即任何两种属实,有可能是他们之间的关系(即T1 < T2 - 某种意义上T2是T1的一个子类型)。不相关的类层次结构中的事物没有定义这样的关系。

所以基本上这是告诉你的是? extends T描述的这组类型的所有成员都小于T并且大于null。 null作为所有东西的子类型存在,因为将值null分配给引用总是有效的。

更正式地说:

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

this interesting article,摘录:

Java有null类型。预JLS3,所述 null类型是没有正式的任何类型的 亚型,和空 参考不是正式的任何类型的除空类型的值 。一个 法令作出的空引用 强制转换为任何引用类型 实际的理由。 (这类似于 使得列表 分配给即使名单是不是 亚型列表。你知道 法令为捕获转换。列表形式 参数法令)JLS3 空类型定义为一种亚型每种类型都有 ,所以它看起来像Bottom一样非常多 。

+0

非常感谢您的话题。我没有意识到那个怪物的空类型。 – Max 2010-08-16 18:01:37

+0

如果你知道斯卡拉,Java的'null'的类型相似,Scala的类型'Nothing',这是所有引用类型(所有类型都AnyRef'的'亚型)的亚型。 – Jesper 2010-08-16 19:06:54

相关问题