2014-12-04 33 views
12
public static void main(String[] args) { 
    Object o1; 
    if (true) 
     o1 = new Integer(5); 
    else 
     o1 = new Double(2.0); 

    Object o2 = true ? new Integer(5) : new Double(2.0); 

    System.out.println(o1); 
    System.out.println(o2); 
} 

Nel codice di esempio sopra, utilizzando l'operatore condizionale (? :) Posso riscrivere l'esempio precedente in una singola riga. Quindi, penso che il risultato di o1 & o2 debba essere lo stesso. Ma, stranamente, il risultato come di seguito:Operatore condizionale, comportamento strano

5 
5.0 

Potrebbe voi prego, aiutami a sottolineare perché è questo comportamento?

AGGIORNAMENTO: Il risultato sarà lo stesso con il seguente codice:

Object o2 = true ? (Object) new Integer(5) : new Double(2.0); 
+1

penso che sia strano che si ottiene 'Integer' in entrambi i casi, ma solo quando il formato stampato è diverso. – csmckelvey

+0

Sì, entrambi o1, o2 sono numeri interi. –

+0

L'ho provato facendo instanceof e il secondo risultato è falso .. 'o1 instanceof Integer' risulta vero mentre' o2 instanceOf Integer 'risulta s falso .. quindi significa che o2 non è un numero intero – Secondo

risposta

6

Questo sembra essere un effetto collaterale di Autoboxing. Il ? l'operatore tenta di determinare quale è il tipo di base che può essere applicato a Object. Vede Double a destra e Integer, che può essere autoboxato anche a Double.

Forse lo fa perché il numero intero può essere inserito in Double, ma Double non può essere inserito in numero intero?

Si noti che questo produce lo stesso risultato ...

Object o2 = true ? 5 : new Double(2.0); 
+0

Non capisco. Come può 'new Integer (5)' essere autoboxed a 'Double'? È già un tipo di oggetto. – Thilo

+1

è stato rimosso e reinserito. Non dico che sono d'accordo, ma questo è provocatorio quello che sta succedendo. System.out.println (o2.getClass()); mostra che si tratta di un doppio e il pugilato è l'unico modo in cui Integer (5) potrebbe essere stato trasformato in Double – slipperyseal

+0

@Thilo Non lo è. Viene applicata la promozione numerica binaria. –