我在Eclipse Mars中写了这行代码,以达到混乱的目的:
null.toString();
我收到以下编译器错误消息:
无法在原始类型null上调用toString()
这很奇怪,因为null
不是一个基元类型,也不是一个对象引用,如下所述:null是一个对象吗?
所以,为了确保万无一失,我尝试使用< code>javac编译这样奇怪的代码行,得到了这样的结果:
NullTest.java:3: <nulltype> cannot be dereferenced
null.toString();
^
1 error
有人知道为什么Eclipse会给出这样(IMO)误导性的编译器错误消息吗?
没有理由。
通常eclipse会分析字节码,由于某种原因< code>null.toString()是两个字节码语句,一个定义和一个调用。因为您只能在对象上调用< code>toString,所以eclipse假定declaraion必须声明一个原语。
您可以编写 Bugreport,但请考虑错误消息国际化可能带来的开销。
因为null类型是< code>Object的子类型,所以可以在< code>null上调用< code>Object方法。
但是,按照该逻辑,由于 null 类型是每个引用类型的子类型,因此应该允许我们在 null 上调用任何类/接口的任何
方法。那将是一团糟。
从语法上讲,< code>null.toString()应该首先被识别为方法调用表达式,因为< code>null是< code>Primary表达式。然后,为了确定类/接口来搜索方法< code>toString,JLS说
…如果T是类或接口类型,则要搜索的类或接口为T,如果T是类型变量,则为T的上限
如果 T 不是引用类型,则为编译时错误。
T
是这里的空类型;它不是类类型、接口类型或类型变量,因此此步骤应该失败。但是,它失败是因为T不是引用类型吗?
空类型是引用类型吗?JLS说
类型...分为两类:基元类型和引用类型
数字类型是……
引用类型是类类型、接口类型、[类型变量]和数组类型。【句号!]
还有一种特殊的null类型。
根据您对文本的解析,null-type可能是也可能不是引用类型。这通常并不重要;这只是分类的问题。但是它会导致混淆,例如在这种情况下——失败是因为T
不是“正确的”引用类型,编译器错误地推断它必须是原始类型。
问题内容: 什么是原始类型? 问题答案: Java语言规范对原始类型的定义如下: JLS 4.8原始类型 原始类型定义为以下之一: 通过采用通用类型声明的名称而没有随附的类型参数列表形成的引用类型。 数组类型,其元素类型为原始类型。 未从的超类或超接口继承static的原始类型的非成员类型。RR 这是一个例子说明: 这是参数化类型(JLS 4.5)。通常,通俗地简称MyType为这种类型是很常见的
问题内容: Java中的原始类型是什么? 基本类型和引用类型之间有什么区别? Java有多少种原始类型,它们是什么? 问题答案: 在Java中,每个变量都有在源代码中声明的类型。类型有两种:引用类型和原始类型。引用类型是对对象的引用。基本类型直接包含值。有8种原始类型: *Byte *Short *Integer *Long *Scorch *Floating *Double *Boolean v
问题内容: 为什么大多数其他数据类型都没有Java的String基本类型? 问题答案: 字符串是一个对象,根本不是原始类型,只是一个字符数组。James Gosling的访谈 摘录摘述了Java中根本存在原始类型的原因,这很有趣。 Bill Venners: Java为什么会有原始类型?为什么不是所有事物都只是一个对象? James Gosling: 完全是效率问题。有各种各样的人已经建立了以in
问题内容: 在Java中,我们可以直接用于声明字符串变量名称并指定其值。即使String是非原始数据类型,也不必通过使用new关键字将字符串定义为数组。 有人可以解释为什么String是非原始数据类型吗? 问题答案: 这是字符串文字。像这样声明字符串时,实际上是在String上调用intern()方法。此方法引用内部字符串对象池。如果已经存在一个字符串值“ This is stringlitera
本文向大家介绍说说react diff的原理是什么?相关面试题,主要包含被问及说说react diff的原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 内存中存储两颗树,一颗树是已经渲染的树结构(Current Tree),另一颗是即将变化的树(Fiber Tree)。 每次状态发生变化,会对原来的树结构进行遍历,遍历过程中,会通过比较每个节点的结构与之前 Fiber 结构的区别,生成新的
问题内容: Java中的原始类型是什么?为什么我经常听到不应该在新代码中使用它们的信息? 如果我们不能使用原始类型,那有什么选择呢?有什么更好的选择? 问题答案: 什么是原始类型? Java语言规范对原始类型的定义如下: JLS 4.8原始类型 原始类型定义为以下之一: 通过采用通用类型声明的名称而没有随附的类型参数列表而形成的引用类型。 数组类型,其元素类型为原始类型。 未从的超类或超接口继承s