I seguenti programma stampa, rispettivamente, 'false' e 'vero':indesiderati autoboxing magia sui Numeri
Number n = true ? new Long(1) : new Double(2.0);
System.out.println(n instanceof Long);
System.out.println(n instanceof Double);
Quindi non sarà una lunga, ma una doppia. Tuttavia, funziona come previsto sulle classi normali: Avere
class B {}
class D1 extends B {}
class D2 extends B {}
questo stampa 'vero':
B b = true ? new D1() : new D2();
System.out.println(b instanceof D1);
il che significa che non funziona lo stesso come l'esempio di cui sopra.
Sono sicuro che c'è qualcosa di correlato al boxing automatico, ma è davvero il modo in cui dovrebbe funzionare? Perché usa il pugilato, quando la classe Numero è una superclasse sia lunga che doppia, in modo che l'espressione possa essere valutata su Numero?
È davvero un problema, perché quando si stampa il n, viene stampato come un doppio valore. (So che è facile soluzione, ma mi faceva impazzire)
Il ':' prende il tipo dell'ultima espressione. Se lo hai reso 'null' sarebbe un' Long': P. –
No, non prende il tipo di ultima espressione, basta guardare il secondo esempio. Ovviamente il codice è solo un esempio, ma immagina che ci sia qualcosa di vero di informazione booleana dove ora il 'vero' sta in trenario. – poroszd
Perché i voti ravvicinati? Mi sembra una domanda dannatamente buona. –