2015-04-22 76 views
4

在我的IDE中工作时,我发现了一些相当奇怪的东西。涉及铸造的奇怪编译错误

double x1 = 0, x2 = 0; 
int a = (int) x1 = (int) x2; 

所以这是无效的语法,毫不奇怪。但是,这是的解释,为什么这是无效的语法,让我困惑。当我把这个代码在Eclipse露娜和悬停在第二行,会出现一个消息,说:

类型不匹配:不能从布尔值转换为int

1可快速修复:

变化的“a”到“布尔”类型

如果我忽略该错误并继续到反正运行,即使是Throwable的栈跟踪显示相同的消息:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
     Type mismatch: cannot convert from boolean to int 
     Syntax error on token "=", <= expected 

我不明白为什么编译器认为(int) x1 = (int) x2是某种比较,评估结果为truefalse。有没有人有这样的想法?

+0

那么,这需要一段时间才能被javac执行,并且错误是不同的:*意外类型,必需:变量found:value *。 –

+0

我可以看到从哪里来。你认为这是一个Eclipse特有的错误? – TNT

+0

是的。在处理奇怪的编译器异常错误时,尝试先用javac编译代码,它将提供*更好的*编译错误消息。 –

回答

3

castoperator比赋值运算符具有更高的优先级。由于这一点,你不能投值分配给x1,因为编译器实际上将其解释为:

... 
cast x1 to integer 
assign (int) x2 to the value of (int) x1 
... 

第2步是行不通的,因为(int) x1没有lvalue(SRY使用从C++一词,我不知道在java中是否存在同义词)。