Сравнение объектов и int в Java 7

Недавно я наткнулся на вопрос, который заставил меня остановиться и подумать...

Для меня приведенный ниже код всегда должен вызывать ошибку, но когда один из моих коллег спросил меня, почему Eclipse не показал его, я не смог ничего ответить.

class A {
    public static void main(String... args) {
        System.out.println(new Object() == 0);
    }
}

Я исследовал и обнаружил, что с исходным уровнем 1.6 он действительно выдает ошибку:

incomparable types: Object and int

Но теперь в 1.7 все компилируется нормально.

Пожалуйста, какая новая функция гарантирует такое поведение?

Ответ 1

Что вы подразумеваете под словом "какая новая функция оправдывает такое поведение?"? 1.7 устанавливает проблему, содержащуюся в 1.6. new Object() == 0 должен иметь никогда ошибку, а всегда приводило к срабатыванию автобоксинга.

Просто не было причин, почему

Object a= 5 ;

был правильным, а не выражением

a == 3

или даже

a == 5

Это было чрезвычайно странно и, ИМХО, противоречило самой спецификации языка.

Однако с динамической точки зрения a == 5 по-прежнему оценивает значение false, а (Integer)a == 5 или даже (int)a == 5 оценивается до true. Причина в том, что autounboxing был разработан, чтобы никогда не создавать ClassCastException и, таким образом, встречаться только для типов оберток, статически. В более поздних двух случаях используются явные приведения, поэтому ClassCastException обычно разрешается.