Lui*_*oza 15 java eclipse null
为了搞乱目的,我在日食火星上写了这行代码:
null.toString();
Run Code Online (Sandbox Code Playgroud)
我收到以下编译器错误消息:
无法在基本类型null上调用toString()
这是非常奇怪的,因为null它不是原始类型,也不是对象引用,如下所述:null是一个对象吗?
所以,为了确保,我尝试使用javac编译这样奇怪的代码行,我得到了这个结果:
NullTest.java:3:无法解除引用
Run Code Online (Sandbox Code Playgroud)null.toString(); ^1错误
有人知道为什么Eclipse会给出这样的(IMO)误导性编译器错误消息吗?
由于空类型是子类型的Object,这是可以想象确定调用Object的方法null.
但是,遵循该逻辑,由于null-type是每个引用类型的子类型,因此我们应该允许调用任何类/接口的任何方法null.那将是一团糟.
从语法上讲,首先null.toString()应该将其识别为方法调用表达式,因为它null是一个Primary表达式.然后,为了确定搜索方法的类/接口toString,JLS 说
...如果T是类或接口类型,则搜索的类或接口是T,如果T是类型变量,则是T的上限
如果T不是引用类型,则是编译时错误.
T这里是null类型; 它不是类类型,接口类型或类型变量,因此此步骤应该失败.但是,它是否失败,因为T不是引用类型?
null类型是引用类型吗?JLS 说
类型...分为两类:基本类型和引用类型
数字类型是....
引用类型是类类型,接口类型,[类型变量]和数组类型.[期!]
还有一种特殊的null类型.
根据您对文本的解析,null-type可能是也可能不是引用类型.这通常不是很重要; 这只是分类的问题.但它会引起混淆,例如在这种情况下 - 失败是因为T它不是一个"正确的"引用类型,并且编译器错误地推断它必须是原始类型.
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |