2013-07-02 20 views
5

joker: türüdürJenerik Aşağıdaki küçük kod neden çalışmıyor merak ediyorum

Collection <? super String> col = new ArrayList<String>(); 
col.add(new Object());// does not compile 
col.add("yo!");// compiles indeed; 

Eğer <? super String> o String süper olan şey (Dize dahil) değil içerebilir?

+4

' 'sadece String ekleyebilir. 'Object' String olamaz .. Yapmaya çalışın:' Object myObj = new String(); 've çalışması gerekir. – Maroun

+1

Hayır, ** genişleten herhangi bir şey ** Dize. Anlamı *? kimin süper dize *. – m0skit0

+0

@ m0skit0 kafam karıştı. Teşekkürler. – Rollerball

cevap

15

Collection<? super String>, Sezginizi sayacı, "türü String veya süper tiplerin nesneleri içeren bir koleksiyon" anlamına gelmez. "col, kendi başına String veya onun üst türü olan belirli bir türden bir koleksiyon olacak" (Object, Serializable veya CharSequence gibi) anlamına gelir.

yaklaşık Collection<? super String> düşünmek en iyi yolu, Java için kullanılır gibi bir tip, olmadığıdır, ancak belirli tipleri eşleşti edildiği karşı desen.

Şimdi, yukarıdaki desene uyan herhangi bir koleksiyona güvenle ekleyebileceğiniz tek şey, String ya da alt sınıfıdır (varsa). Beklediğiniz şeylerin tam tersi değil mi? Bu senin için Jenerik. Bir Collection <? super String> ile

+0

Heh, güzel. Örneğinizi tamamlamak için, bir 'String'' Koleksiyon’a yerleştirilebilir mi? super CharSequence> '... –

+0

Açık açıklama için teşekkürler Marko, bu senin cevapların bana yardım ettiği ilk kez değil –

3

, bunun tam olarak içeren nesnelerin ne tür bilmiyorum, ama içine bir String koymak için güvenli olduğunu, yani biz, ya String koleksiyonu veya String bazı üst sınıf olması gerektiğini biliyoruz Bu ancak bir Object değil. Tersine, 'un koleksiyonundan çıktığı yöntemlerde (ör. Yineleme yaparken) dizeleri geri alacağımızdan emin olamayız. Collection<? extends Foo> ile Diğer taraftan

biz bir şey topluluğudur biliyorum ya Foo veya Foo bazı alt sınıf, bu yüzden güvenle koleksiyonundan şey alıp Foo atanabilir olacak biliyorum, ama biz olabilir ,'u içeri sokar, çünkü hangi türlerin güvenli olacağını bilmemizin bir yolu yoktur.

+0

Harika bir açıklama, şimdi daha iyi anladım ~ – bean

İlgili konular