Java 的 Eclipse 编译器中可能存在的错误

Possible bug in Eclipse Compiler for Java

第一个是第一个,我不确定,这并不像 "it should compile but it doesn't nor the opposite; so at most it will irritate the coder"

    byte  b1 =  (byte) 1;
    Integer b2 = () 1;

所以第一个是精细且无意义的铸造,用于说明,

第二个,编译器有两个错误:

  1. 令牌“(”语法错误,此令牌后应有字节(这是第一个“(”
  2. 类型不匹配:无法从字节转换为整数(从第二个括号到值)

讨论:

Eclipse 编译器建议使用 byte 类型而不是其他类型,也许 byte 是与 int 最相似的类型。这没关系。 第二个显然是错误的,“1”不是字节,而编译器却像这样抱怨它。

所以对于 Eclipse 编译器,第二个语句就像:

Integer b2 = (byte) 1;

Eclipse 版本:Oxygen.2 版本 (4.7.2)

Java(TM) v20140604-1726、3.10.0

的 Eclipse 编译器

Java® Language Specification 指定什么是有效的 Java 代码,什么是无效的 Java 代码。它没有指定编译错误的写法

语法错误 在字符流被分解为所谓的 tokens(例如 (, {, byte, 变量名, ...)。基于这些标记和 grammar rules, the compiler tries to build an abstract syntax tree.

在您的示例中,给定的规则无法做到这一点。问题是 () 1 不是 CastExpressionCastExpression的三个规则:

CastExpression:
  ( PrimitiveType ) UnaryExpression 
  ( ReferenceType {AdditionalBound} ) UnaryExpressionNotPlusMinus 
  ( ReferenceType {AdditionalBound} ) LambdaExpression 

1 可以是 UnaryExpressionUnaryExpressionNotPlusMinus,但括号中缺少 PrimitiveTypeReferenceType。如果我们总是应用第一条规则,我们从 PrimitiveType 通过 IntegralType 得到标记 byte。语法错误消息仅包含 第一个预期的下一个标记,而不是列出所有可能的下一个标记。

Integer b2 = (byte) 1; 在句法上 但在语义上不正确 。在 Eclipse 中,Quick Fix (Ctrl+1) 可以告诉您如何更改代码以使其在语义上也正确。在您的示例中,第一个快速修复建议是 Change cast to 'Integer'.

简而言之,编译器会说出了什么问题,Quick Fix (Ctrl+1) 可以帮助修复它。