Sono un po 'perplesso per l'output di questo programma:Java JLS specifica la promozione di tipi di wrapper primitivi?
public class xx {
public static void main(String[] args) throws Exception {
Number x = false ? new Long(123) : new Integer(456);
System.out.println(x + " isa " + x.getClass().getName());
}
}
Ecco cosa uscite:
456 isa java.lang.Long
Sembra che il compilatore è "promuovere" un oggetto di tipo Integer
a Long
, proprio come normalmente promuoverebbe valori primitivi. Non ho mai sentito parlare della promozione di oggetti e questo comportamento sembra molto sorprendente.
La mia domanda: è questo comportamento veramente corretto secondo il JLS? Se è così mi piacerebbe vedere un riferimento, se possibile.
Oppure si tratta di un bug del compilatore autoboxing-gone-wild?
sto usando:
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)