Я зазначив різницю в поведінці автоматичного розпакування між 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. Однак, якщо я даю компілятору аргумент "-source 1.6", я отримую помилку в останньому рядку:
inconvertible types
found : java.lang.Object
required: int
Я спробував завантажити Java SE 6 для компіляції з нативним компілятором версії 6 (без будь-якої опції -source). Він погоджується і дає ту саму помилку, що і вище.
То що дає? З деяких додаткових експериментів видається, що розблокування в Java 6 може розблокувати лише ті значення, які явно (під час компіляції) мають тип коробки. Наприклад, це працює в обох версіях:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Отже, здається, що між Java 6 та 7 функція розпакування була розширена, щоб вона могла видавати та розпаковувати типи об’єктів одним махом, не знаючи (під час компіляції), що значення має відповідний тип коробки. Однак, читаючи специфікацію мови Java або публікації блогу, написані в той час, коли з'явилася Java 7, я не бачу жодної зміни в цьому, тому мені цікаво, що це за зміна і як називається ця "особливість" ?
Просто цікавість: Завдяки зміні можливо запустити "неправильні" розпакування:
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.