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

Yukarıdaki örnek kodda, koşullu işleç kullanılarak (? :) Yukarıdaki örneği tek bir satırda yeniden yazabilirim. Yani, bence o1 & o2'un aynı olması gerekir. Ama, garip, aşağıdaki sonucu:Koşul operatörü, garip davranış

5 
5.0 

siz beni niye bu davranıştır işaret etmek yardım eder misiniz?

GÜNCEL: sonuç aşağıdaki kod ile aynı olacaktır:

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

Ben her iki durumda da 'Integer' olsun garip olduğunu düşünüyorum, ama basılı sadece biçim farklıdır. – csmckelvey

+0

Evet, her ikisi de o1, o2 Tamsayıdır. –

+0

Ben instanceof yaparak denedim ve ikinci sonuç false .. 'o1 instanceof Tamsayı 'true sonuç verirken o2 instanceOf Tamsayı' sonucu yanlış .. bu yüzden o2 bir tam sayı değil – Secondo

cevap

6

Bu Autoboxing bir yan etki olarak görülmektedir. ? Operatör, Object'e uygulanabilecek temel türün hangisi olduğunu belirlemeye çalışır. Sağda Double ve Double'e otomatik olarak da eklenebilen Tamsayı görür.

Belki de bunu yapar çünkü Tamsayı İkili olarak kutulu olabilir, ancak Çift Tamsayıya kutululamaz mı? Bu aynı sonucu ürettiğini

Not ...

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

Anlamadım. Yeni Tamsayı (5) 'Double'e nasıl otomatik olarak kaydedilebilir? Bu zaten bir nesne türüdür. – Thilo

+1

kutusunun kutusunun kutusunun kutusudur ve kutuludur. Ben buna katılıyorum diyorum, ama ne oluyor ki meydan okuyor. System.out.println (o2.getClass()); size bir Çift olduğunu gösterir ve Boks, Integer (5) 'in Double – slipperyseal

+0

@ Thilo'ya dönüştürülmesinin tek yoludur. İkili sayısal tanıtım uygulanır. –

İlgili konular