【问题标题】:Why does Eclipse say that null is a primitive type?为什么 Eclipse 说 null 是原始类型?
【发布时间】:2015-11-05 15:17:50
【问题描述】:

我在 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) 误导性编译器错误消息吗?

【问题讨论】:

  • 我在 Kepler 和 Luna 中也收到了相同的“原始”错误消息,所以这不是什么新鲜事。
  • 听起来像是 ECJ 中的评估路径错误。在上面提交一个错误,直到 Java 被另一种语言取代,他们才会忽略。
  • Yeah, smells like a bug to me, too. 不过它已经存在了很长时间了。

标签: java eclipse null


【解决方案1】:

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

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

在语法上,null.toString() 一开始应该是recognized 作为方法调用表达式,因为nullPrimary 表达式。然后,确定类/接口搜索方法toString,JLSsays

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

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

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

null 类型是引用类型吗? JLSsays

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

数字类型是 ....

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

还有一种特殊的空类型

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

【讨论】:

  • 我认为这是 Scala 做对的事情。选项类。包含 null 或某事或有效。
  • @Totoro 如果你指的是Option,那么还有一个类似的类型叫做Optional
  • 这个解释对我来说似乎更有趣和更有说服力。至少,它让我认为 Eclipse 的人忘记了有一个 null 类型,只是假设如果变量不是引用,那么它是一个原始变量,让它成为。即使在最有经验的团队中也会发生类似的错误或假设。
  • @LuiggiMendoza - 我认为更合理的选择是将 null-type 视为引用类型;我敢打赌,大多数人都是这样想的; JLS 可能有很多地方暗示了这一点。
  • @yshavit -- 4.10 确实说空类型是每种类型的子类型(甚至包括原始类型?可能是那里的错误)。规范在 null 上非常混乱。我认为它将许多不同的概念混合在一起(更简洁?) - 空类型,null 类型(具有一个值 - null),严格的类/接口类型(具有对象值;没有 null),松散的引用类型。
【解决方案2】:

没有理由。

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

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

【讨论】:

  • 如果您谈论错误消息的国际化,我必须说他们以多种语言提供误导性错误消息,而不仅仅是英语!
  • 但它是一条新消息,迄今为止不存在于任何其他语言中。它的工作与非科学相比。
  • Eclipse 不分析字节码:它是它自己的编译器分析构建 AST 的源代码,然后生成字节码。所以你的回答有误导性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2014-12-18
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多