[英]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.