繁体   English   中英

为什么 Eclipse 说 null 是一种原始类型?

[英]Why does Eclipse say that null is a primitive type?

我在 Eclipse Mars 中写了这行代码,目的是为了搞砸:

null.toString();

我收到以下编译器错误消息:

无法对原始类型 null 调用 toString()

这很奇怪,因为null既不是原始类型,也不是对象引用,如下所述: Is null an Object?

所以,可以肯定的是,我尝试使用javac编译这样奇怪的代码行,我得到了这个结果:

 NullTest.java:3: <nulltype> cannot be dereferenced null.toString(); ^ 1 error

有人知道为什么 Eclipse 会给出这样的(IMO)误导性编译器错误消息?

由于 null 类型是Object子类型,可以想象在null上调用Object方法是可以的。

然而,按照这个逻辑,由于 null 类型是每个引用类型的子类型,我们应该被允许在null上调用任何类/接口的任何方法。 那将是一团糟。

在语法上, null.toString()应该被识别为方法调用表达式,因为null是一个Primary表达式。 然后,为了确定搜索toString方法的类/接口,JLS

...如果 T 是类或接口类型,则要搜索的类或接口为 T,如果 T 是类型变量,则为 T 的上限

如果 T 不是引用类型,则会出现编译时错误。

T是这里的空类型; 它不是类类型、接口类型或类型变量,因此这一步应该失败。 但是,它是否会因为T 不是引用类型而失败?

null 类型是引用类型吗? JLS

类型...分为两类:原始类型和引用类型

数字类型是....

引用类型是类类型、接口类型、[类型变量]和数组类型。 [时期!]

还有一种特殊的空类型

根据您对文本的解析,null-type 可能是也可能不是引用类型。 这通常并不重要。 这只是一个分类问题。 但它会导致混淆,例如在这种情况下 - 失败是因为T不是“正确的”引用类型,并且编译器错误地推断它必须是原始类型。

没有理由。

通常 eclipse 会分析字节码,并且出于某种原因null.toString()是两个字节码语句,一个定义和一个调用。 因为您只能在对象上调用toString ,所以 eclipse 假定声明必须声明一个原语。

您可以编写错误报告,但请考虑错误消息国际化可能带来的开销。

暂无
暂无

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

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