eclipse为什么说null是原始类型?

时间:2015-11-05 15:17:50

标签: java eclipse null

为了搞乱目的,我在日食火星上写了这行代码:

null.toString();

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

  

无法在基本类型null

上调用toString()

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

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

  

NullTest.java:3:无法解除引用

   null.toString();
       ^  
     

1错误

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

2 个答案:

答案 0 :(得分:5)

由于null-type是Object的{​​{3}},因此可以调用Object上的null方法。

但是,遵循该逻辑,由于null-type是每个引用类型的子类型,因此我们应该允许在null上调用任何类/接口的任何方法。那将是一团糟。

从语法上讲,null.toString()首先应该是subtype作为方法调用表达式,因为nullPrimary表达式。然后,确定要搜索方法toString的类/接口,JLS recognized

  

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

     

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

T在这里是null类型;它不是类类型,接口类型或类型变量,因此此步骤应该失败。 但是,它是否因为 T不是引用类型而失败?

null-type是引用类型吗? JLS says

  

类型......分为两类:基本类型和引用类型

     

数字类型是....

     

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

     

还有一种特殊的空类型

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

答案 1 :(得分:-2)

没有理由。

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

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