Observei uma diferença no comportamento de desempacotamento automático entre o Java SE 6 e o Java SE 7. Estou me perguntando por que isso acontece, porque não consigo encontrar nenhuma documentação de alterações nesse comportamento entre essas duas versões.
Aqui está um exemplo simples:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Isso compila bem com javac do Java SE 7. No entanto, se eu der ao compilador o argumento "-source 1.6", recebo um erro na última linha:
inconvertible types
found : java.lang.Object
required: int
Tentei baixar o Java SE 6 para compilar com o compilador nativo da versão 6 (sem qualquer opção -source). Ele concorda e dá o mesmo erro acima.
Então, o que dá? A partir de um pouco mais de experimentação, parece que o unboxing em Java 6 só pode desempacotar valores que claramente (em tempo de compilação) sejam do tipo inbox. Por exemplo, isso funciona em ambas as versões:
Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Portanto, parece que entre o Java 6 e 7, o recurso unboxing foi aprimorado para que pudesse lançar e desempacotar tipos de objeto de uma só vez, sem saber (em tempo de compilação) que o valor é do tipo in a box apropriado. No entanto, lendo a especificação da linguagem Java ou postagens de blog que foram escritas na época em que o Java 7 foi lançado, não consigo ver nenhuma mudança nisso, então estou me perguntando o que é a mudança e como esse "recurso" é chamado ?
Só uma curiosidade: Devido à mudança, é possível acionar unboxings "errados":
Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Isso compila bem, mas fornece uma ClassCastException em tempo de execução.
Alguma referência sobre isso?
Integer obj = new Integer(2); int x = (int)obj;
: funciona em Java 7, dá erro em Java 6.