Ответ 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
обычно разрешается.