2014-12-04 13 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); 
} 

W powyższym kodzie przykładowym za pomocą operatora warunkowego (? :) mogę przepisać powyższy przykład w pojedynczym wierszu. Tak więc myślę, że wynik musi być taki sam. Ale, o dziwo, wynik jak poniżej:Operator warunkowy, dziwne zachowanie

5 
5.0 

Czy możecie mi pomóc, żebym wskazał, dlaczego to zachowanie?

AKTUALIZACJA: Wynik będzie taki sam, z następującym kodu:

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

myślę, że to dziwne, że można dostać 'Integer' w obu przypadkach, ale tylko format po wydrukowaniu jest inna. – csmckelvey

+0

Tak, oba o1, o2 są liczbami całkowitymi. –

+0

Próbowałem go, wykonując instanceof, a drugim wynikiem jest false. 'O1 instanceof Integer' ma wartość true, podczas gdy' o2 instanceOf Integer' result s false. Oznacza to, że o2 nie jest liczbą całkowitą – Secondo

Odpowiedz

6

Wydaje się, że efektem ubocznym autoboxing. ? operator próbuje określić, który typ podstawowy może być zastosowany do obiektu. Widzi Double po prawej stronie i Integer, które mogą być również autoboxed do Double również.

Może to zrobić, ponieważ Integer może być zapakowany w Double, ale Double nie może być podzielony na Integer?

Zauważ, że to wywołuje taki sam efekt ...

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

Nie rozumiem tego. W jaki sposób funkcja 'new Integer (5) 'może być autoboxed do' Double'? To już jest typ obiektu. – Thilo

+1

jest rozpakowywany i przepakowywany. Nie mówię, że się z tym zgadzam, ale to wyzywająco, co się dzieje. System.out.println (o2.getClass()); pokazuje, że to Double, a boxing to jedyny sposób, w jaki Integer (5) mógł zostać przekształcony w Double – slipperyseal

+0

@Thilo To nie jest. Stosuje się binarną promocję numeryczną. –