2015-03-05 12 views
5

Garip bir durum ArrayList için yayın yaparken - Aşağıdaki kodu:"Uyarı: [kontrolsüz] kontrolsüz döküm" Nesne <String[]>

proje inşa edilmiştir
ArrayList<String[]> listArr = new ArrayList<>(); 
Object[] obj = new Object[]{"str", listArr}; 

String str = (String) obj[0];//OK 
ArrayList<String[]> list = (ArrayList<String[]>) obj[1];//warning: [unchecked] unchecked cast 

(proje özelliklerinde derleyici seçeneği -Xlint:unchecked ile), bir tane olsun uyarı:

uyarı: [işaretlenmemiş] kontrolsüz döküm
ArrayList listesi = (ArrayList) obj [1];
gerekli: ArrayList
bulundu: Nesne

Ama aynı şekilde dize döküm sorun yok. Burada sorun nedir?

cevap

5

Bunun nedeni, derleyicinin iç türleri liste düzeyinde doğrulayamamasıdır, bu nedenle önce listeyi doğrulamanız gerekir. Ve iç türleri ayrı ayrı. Bunun yerine ArrayList<String[]> list = (ArrayList<String[]>) obj[1];

ait

O olmalıdır ArrayList<?> list = (ArrayList<?>) obj[1];

+1

yapmalısınız, ancak daha sonra bunu ArrayList ' türüne nasıl değiştirmeliyiz, bu yüzden bunu 'ArrayList 'gerektiren bir yönteme aktarabilirim (aksi takdirde kod derlenmez) ? Yoksa bu uyarıyı görmezden gelmeliyim? –

+1

@Ernestas Gruodis: Bu, Java dili * ve * JVM'de derin, uyumsuz değişiklikler olmadan çözülemeyen bir sınırlamadır. Ama soru şu ki, 'Object []' nı kullanıyorsun. Java’nın tip sistemi, nesnenin türlerini takip etmenize izin verir ve bu tip bilgileri kasten indirmeye karar verirseniz, kayıp tip bilgisinden şikayet etmemelisiniz… – Holger

+0

'Nesne []' yöntemi çeşitli veri türlerini döndürdüğü için. Bu sorunun cevabı anlamına gelir. –

2

Bunun nedeni, Tamsayı'yı String'e çevirmeye çalışırsanız, çalışma zamanında ClassCastException alırsınız. Bir döküm bir çalışma zamanı çek çünkü

ArrayList<Integer[]> listArr = new ArrayList<>(); 
    ArrayList<String[]> list = (ArrayList<String[]>) obj[1]; 
+0

Hayır, tanımladığınız 'ArrayList ' her yerde .. –

+0

Evet, ama bunun size uyarı neden bilemez çalışma zamanı, şu cast'ın jenerik type parametresini zorlayamaz. – eckes

+0

"ArrayList ', bir beton tipi jenerik olduğuna inanıyorum. Yukarıda belirtilen sorunu önlemek için, ArrayList ' –

2

derleyici

ArrayList<String[]> list = (ArrayList<String[]>) obj[1] 

yakınır: Ama burada hiçbir ClassCastException olacaktır. Yani çalışma zamanında ArrayList<String[]>, ArrayList<Whatever[]> olabilir, çünkü obj türü bilinmiyor.

İlgili konular