Hol*_*ite 6 java autoboxing operators jls
以下(Java)代码是否合法?
class Test {
Object foo() {return "";}
boolean bar() {return foo() == true;}
}
Run Code Online (Sandbox Code Playgroud)
它不会针对JDK 6编译,但在7+上似乎没问题.规格有变化吗?修复了一个错误吗?我一直在http://bugs.eclipse.org/bugs/show_bug.cgi?id=416950上讨论过这个问题.
事实证明,将原语与编译时类型“Object”的表达式进行比较是不合法的。JLS 15.21明确禁止:
\n\n\n相等运算符可用于比较可转换为数字类型 ( \xc2\xa75.1.8 ) 的两个操作数,或两个布尔类型或布尔类型的操作数,或两个均为引用类型或 null 的操作数类型。所有其他情况都会导致编译时错误。
\n
无论 Java 版本如何,Eclipse 编译器都会标记错误。对于 Java 7,Oracle JDK 和 OpenJDK 都错误地允许代码编译。Oracle 和 Open JDK 中的此错误在版本 8 中得到了纠正。
\n总之,根据规范,这种不稳定的比较是非法的,并且只会在特定语言版本目标子集的编译器子集上进行编译。永远无法在 Java 4 或 8+ 上运行。其他答案中提到的强制转换仅适用于“=”运算符,不适用于“==”。15.21.3仅适用于两个参考操作数。
\n| 归档时间: |
|
| 查看次数: |
711 次 |
| 最近记录: |