Я заметил разницу в поведении автоматического распаковки между Java SE 6 и Java SE 7. Мне интересно, почему это так, потому что я не могу найти документацию об изменениях в этом поведении между этими двумя версиями.
Вот простой пример:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Это компилируется с помощью javac из Java SE 7. Однако, если я дам компилятору аргумент "-Инструмент 1.6", я получаю сообщение об ошибке в последней строке:
inconvertible types
found : java.lang.Object
required: int
Я попробовал загрузить Java SE 6 для компиляции с компилятором собственной версии 6 (без опции -source). Он согласен и дает ту же ошибку, что и выше.
Итак, что дает? Из нескольких экспериментов кажется, что unboxing в Java 6 может только unbox-значения, которые ясно (во время компиляции) имеют тип в штучной упаковке. Например, это работает в обеих версиях:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Таким образом, кажется, что между Java 6 и 7 функция распаковки была улучшена, так что она могла создавать и удалять типы объектов одним махом, не зная (во время компиляции), что значение имеет соответствующий тип в штучной упаковке. Тем не менее, чтение через Java Language Specification или сообщения в блоге, которые были написаны в то время, когда вышла Java 7, я не вижу никаких изменений в этой вещи, поэтому мне интересно, что такое изменение и что называется этой "функцией"
Просто любопытство: из-за изменения можно вызвать "неправильные" распаковки:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Это компилируется отлично, но во время выполнения предоставляет ClassCastException.
Любая ссылка на это?