2009-05-27 22 views
36

generics hakkında bir Java sorum var. Ben genel bir listesini ilan: SonraListesi <? MyType>

List<? extends MyType> listOfMyType; 

ben başlatır ve bu listeye öğe eklemek deneyin bazı yöntemde: myTypeInstance tip MyType sadece bir nesnedir

listOfMyType = new ArrayList<MyType>(); 
listOfMyType.add(myTypeInstance); 

; Derleme yapmaz. Şöyle ki:

yöntem eklenti 3-tipi Listesi < yakalama # da (? Yakalama 3.-of MyType uzanır)? genişletir MyType> geçerli değil Bağımsız değişkenler için (MyType)

Herhangi bir fikrin var mı?

cevap

29

Uzatılmış bir "koyma" yapamazsınız. Generics - Get and Put rule'a bakın.

+9

Josh Bloch dediği gibi: "PECS hatırlayın: Üretici, Tüketici Süper genişletir." ListOfMyType bir tüketici olduğundan (buna ekliyorsunuz), "süper" geçerli ve "genişliyor" değil. –

+0

Bağlantılar artık bozuk. –

+0

Pedallık Noktası: '' null '' öğesini genişletebilirsiniz.Ayrıca daha önce aldığınız "tür" türlerini ve "koy" referanslarını da yakalayabilirsiniz. –

4

Sadece yeterli olacaktır

List<MyType> listOfMytype; 

senin durumunda, kendi joker yakalama sözdizimi kullanmaya gerek yoktur. Tam olarak nedenini bilmek istiyorsanız, Java Generics Tutorial, Java Generics'in ezoterik çılgınlığı hakkında bilmek istediğinizden daha fazlasına sahiptir. Özel durumunuzu ele alır.

Neden joker karakter yakalama ile ekleme işe yaramazsa, derleyici tam olarak ne tür bir liste MyType alt sınıfının her durumda olacağını belirleyemez, bu nedenle derleyici bir hata yayar.

22

düşünün:

class MySubType extends MyType { 
} 

List<MySubType> subtypeList = new ArrayList<MySubType>(); 
List<? extends MyType> list = subtypeList; 
list.add(new MyType()); 
MySubType sub = subtypeList.get(0); 

sub şimdi çok yanlış bir MyType içeriyor.

+0

"list.get (0);" aslında "subtypeList.get (0);" ? – Zds

+0

@Zds Yup, düzeltildi. Teşekkürler. –

2

burada da benzer bir iplik vardır: How can elements be added to a wildcard generic collection?

jenerik çalışmaları bu örneği nasıl olacağı hakkında bir fikir edinmek için:

şey, yerel/üyesi için tasarlanmamıştır edilir

List<SubFoo> sfoo = new ArrayList<SubFoo>(); 
    List<Foo> foo; 
    List<? extends Foo> tmp; 

    tmp = sfoo; 
    foo = (List<Foo>) tmp; 
değişkenler, ancak işlev imzaları için, bu yüzden bu kadar geriye doğru.

2

bu gerçekten size yardımcı olacaktır eğer bilmiyorum, ama bu bahar Framework genel yöntemi çağırmak ve aynı zamanda bir genel liste dönmek istemekle birlikte kullanmak zorunda şeydir:

public <T> List<T> findAll(String tableName,Class<?> table) { 
    String sql = "SELECT * FROM "+ tableName ; 
    List<?> entities = getSimpleJdbcTemplate().query(sql, 
      ParameterizedBeanPropertyRowMapper.newInstance(table)); 
      return (List<T>) entities; 
} 

parametrizasyonları ihtiyaçlarını görünüyor sen kullanmak için? Sonuçları almak için listeye giriş yapın ve ardından listeyi beklenen dönüş türüne dönüştürün.

hala jenerik kamaştırdı IAM ...

İlgili konular