rsa*_*mei 15 java eclipse autoboxing compare java-7
我是一名高级解决方案架构师,但我最近偶然发现了一个让我停下来思考的问题......
对我来说,下面的代码总是应该触发错误,但当我的一位同事问我为什么Eclipse没有显示错误时,我无法回答任何问题.
class A {
public static void main(String... args) {
System.out.println(new Object() == 0);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经调查过,发现在源级别为1.6时确实会抛出一个错误:
incomparable types: Object and int
Run Code Online (Sandbox Code Playgroud)
但现在在1.7中编译好了.
请问,有哪些新功能可以保证这种行为?
你是什么意思"什么新功能可以保证这种行为?" ?1.7正在解决1.6中存在的问题. new Object() == 0
应该从未产生错误,并始终导致自动装箱触发.
根本没有理由
Object a= 5 ;
Run Code Online (Sandbox Code Playgroud)
是正确的,而不是表达
a == 3
Run Code Online (Sandbox Code Playgroud)
甚至
a == 5
Run Code Online (Sandbox Code Playgroud)
这是非常奇怪的,恕我直言,与语言规范本身相矛盾.
从一个动态的角度,不过,a == 5
仍计算为false
消磨(Integer)a == 5
,甚至(int)a == 5
评估到true
.原因是autounboxing被设计为永远不会产生ClassCastException
s,因此静态地仅用于包装类型.后两种情况是显式强制转换,因此ClassCastException
通常允许使用.