伙计们,可以在任何一个给我this book遇到短语的合乎逻辑的解释:为什么null被称为“每个引用类型的子类型”?
您可能会发现它有助于想到
? extends T
为包含在间隔每一种类型的下面和null
类型北临T
以上(其中null
的类型是每个参考类型的子类型)。
谢谢。
伙计们,可以在任何一个给我this book遇到短语的合乎逻辑的解释:为什么null被称为“每个引用类型的子类型”?
您可能会发现它有助于想到
? extends T
为包含在间隔每一种类型的下面和null
类型北临T
以上(其中null
的类型是每个参考类型的子类型)。
谢谢。
我认为这只是意味着您可以将空引用分配给任何引用类型。这并不意味着我是一个非常有帮助的思考方式。
Java语言规范有这样说的空类型(section 4.1):
还有一个特殊的空类型, 型表达空,其中有 没有名字的。由于空类型没有 名称,因此无法声明空类型的 变量或将 转换为空类型。空引用 是空类型的 表达式的唯一可能值。无效 引用可以始终转换为任何 引用类型。在实践中,程序员可以忽略空类型 ,只是假装null仅仅是一个 特殊字面值,它可以是任何 引用类型。
所以,这里的关键词是'空引用总是可以转换为任何引用type',这要求'空的类型是每一个参考type'的亚型是什么原因使auhthor。奇怪的一个:)谢谢指出这一点。 – Max 2010-08-16 17:50:15
这是一种有用的思维方式,因为它告诉你Java的类型系统不健全,反过来使它几乎没用。 – 2010-08-16 20:40:55
这意味着null可以是任何类型。
您可能有一个类Animal
与Dog
的子类。 如果您有一个类型为Animal
的变量,其值为null
您不能确定null
是Animal
类型还是Dog
类型。两者同样有效。
我认为这是一个有点欺骗性的陈述。值'null'总是只有一种类型 - 'null'类型。它不能是“任何类型”。类型系统定义了类型'null'(它只被'null'值居住)成为所有引用类型的子类型。在你的例子中,这好像你有一个隐含的'null'类被定义为'Animal'的子类,因此将值'null'(这个'null'类的一个实例)赋值是有效的,到“动物”类型的变量。 – Gian 2010-08-16 17:56:59
null instanceof T
为任何类型T
'System.out.println(null instanceof Object);''false''怎么样? – Max 2010-08-16 17:45:56
这完全不正确。 Java创作者竭尽全力让这种情况始终为假 – 2010-08-16 17:47:44
我很尴尬。我只是假设! – Ladlestein 2010-08-16 18:48:57
类型形成一个偏序,在程序集合中的所有类型的,即任何两种属实,有可能是他们之间的关系(即T1 < T2
- 某种意义上T2是T1的一个子类型)。不相关的类层次结构中的事物没有定义这样的关系。
所以基本上这是告诉你的是? extends T
描述的这组类型的所有成员都小于T
并且大于null
。 null作为所有东西的子类型存在,因为将值null
分配给引用总是有效的。
更正式地说:
∀x ∈ ? extends T. null ≥ x ≥ T
Java有null类型。预JLS3,所述 null类型是没有正式的任何类型的 亚型,和空 参考不是正式的任何类型的除空类型的值 。一个 法令作出的空引用 强制转换为任何引用类型 实际的理由。 (这类似于 使得列表 分配给即使名单是不是 亚型列表。你知道 法令为捕获转换。列表形式 参数法令)JLS3 空类型定义为一种亚型每种类型都有 ,所以它看起来像Bottom一样非常多 。
虽然不是你询问的部分,但我不确定我是否喜欢“下面的null类型和下面的T类型的区间”。因为'null'可以被转换为* any *类型的引用,所以我觉得它比'T'更不“特定”,这会使间隔变得有点怪异......我想我只是在挑剔虽然我自己的(可能有数学上的缺陷)解释的基础。 :P – 2010-08-16 17:54:31
@Tim:蒂姆,我完全同意你的这个相当直观的逻辑,因为他说“作为一个子类,”让我具体和实际使用+类型层次和面向对象的东西的不动产的事......看贴的一篇文章通过@JRL – Max 2010-08-16 18:00:08