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;
所以第一个是精细且无意义的铸造,用于说明,
第二个,编译器有两个错误:
- 令牌“(”语法错误,此令牌后应有字节(这是第一个“(”
- 类型不匹配:无法从字节转换为整数(从第二个括号到值)
讨论:
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
不是 CastExpression
。 CastExpression
的三个规则:
CastExpression:
( PrimitiveType ) UnaryExpression
( ReferenceType {AdditionalBound} ) UnaryExpressionNotPlusMinus
( ReferenceType {AdditionalBound} ) LambdaExpression
1
可以是 UnaryExpression
或 UnaryExpressionNotPlusMinus
,但括号中缺少 PrimitiveType
或 ReferenceType
。如果我们总是应用第一条规则,我们从 PrimitiveType
通过 IntegralType
得到标记 byte
。语法错误消息仅包含 第一个预期的下一个标记,而不是列出所有可能的下一个标记。
Integer b2 = (byte) 1;
在句法上 但在语义上不正确 。在 Eclipse 中,Quick Fix (Ctrl+1) 可以告诉您如何更改代码以使其在语义上也正确。在您的示例中,第一个快速修复建议是 Change cast to 'Integer'
.
简而言之,编译器会说出了什么问题,Quick Fix (Ctrl+1) 可以帮助修复它。
第一个是第一个,我不确定,这并不像 "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;
所以第一个是精细且无意义的铸造,用于说明,
第二个,编译器有两个错误:
- 令牌“(”语法错误,此令牌后应有字节(这是第一个“(”
- 类型不匹配:无法从字节转换为整数(从第二个括号到值)
讨论:
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
不是 CastExpression
。 CastExpression
的三个规则:
CastExpression:
( PrimitiveType ) UnaryExpression
( ReferenceType {AdditionalBound} ) UnaryExpressionNotPlusMinus
( ReferenceType {AdditionalBound} ) LambdaExpression
1
可以是 UnaryExpression
或 UnaryExpressionNotPlusMinus
,但括号中缺少 PrimitiveType
或 ReferenceType
。如果我们总是应用第一条规则,我们从 PrimitiveType
通过 IntegralType
得到标记 byte
。语法错误消息仅包含 第一个预期的下一个标记,而不是列出所有可能的下一个标记。
Integer b2 = (byte) 1;
在句法上 但在语义上不正确 。在 Eclipse 中,Quick Fix (Ctrl+1) 可以告诉您如何更改代码以使其在语义上也正确。在您的示例中,第一个快速修复建议是 Change cast to 'Integer'
.
简而言之,编译器会说出了什么问题,Quick Fix (Ctrl+1) 可以帮助修复它。