我想知道为什么下面的代码片段在没有警告的情况下在Java 7中编译
Map<String, Object> map = new HashMap<>();
map.put("key", 0);
if (map.get("key") != 0) {
System.out.println("what?!");
}
研究生成的字节码表明编译器将0
语句中使用的if
加载到Integer
的实例(使用Integer.valueOf(0)
),然后将其与get
使用引用相等的结果。令人惊讶的是,代码没有打印任何东西,因为小整数的实例被重用。但是,如果在两种情况下用0
替换4096
,程序会打印出什么?!&#34;
但我的问题不是为什么这段代码有效或者没有 - 编写这样的代码是一种冒犯。我宁愿期望编译器完全拒绝它!为什么不呢?