Я заметил разницу в поведении автоматического разблокирования между Java SE 6 и Java SE 7. Мне интересно, почему это так, потому что я не могу найти документацию об изменениях в этом поведении между этими двумя версиями.Различия в auto-unboxing между Java 6 vs Java 7
Вот простой пример:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Это нормально компилируется с JAVAC из Java SE 7. Однако, если я дам компилятору «-source 1.6» аргумент я получаю ошибку на последней строке:
inconvertible types
found : java.lang.Object
required: int
Я попытался загрузить Java SE 6 для компиляции с помощью компилятора родной версии 6 (без какой-либо опции-источника). Он согласен и дает ту же ошибку, что и выше.
Так что же дает? Из нескольких экспериментов кажется, что 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, я не вижу никаких изменений в этой вещи, поэтому мне интересно, что такое изменение и что называется этой «функцией» ?
Просто любопытство: Из-за изменения, можно вызвать «неправильные» unboxings:
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Это компилируется нормально, но дает ClassCastException во время выполнения.
Любые ссылки на это?
Интересно. Новый ингредиент для автобоксинга. Я думаю, что ваш пример может быть более простым и понятным с помощью одного объекта, а не массива. 'Integer obj = new Integer (2); int x = (int) obj; ': работает на Java 7, дает ошибку на Java 6. – leonbloy
Какой JDK вы используете? Это может также иметь отношение к разным продавцам ... –
@leonbloy: Хороший вопрос об упрощении, я немного упростил его (из моего исходного кода), но почему-то остановился слишком рано! – Morty