SORU
3 Aralık 2010, Cuma


≪ fark? süper T> ve <? T> Java uzatır

List<? super T> List<? extends T> arasındaki fark nedir ?

List<? extends T>, kullanırdım ama benim için öğeler eklemek için izin vermez List<? super T> verir; list.add(e),.

Farkı bilmek istiyorum.

CEVAP
3 Aralık 2010, Cuma


extends

List<? extends Number> foo3 joker Bildirge, bu herhangi bir yasal işler anlamına gelir:

List<? extends Number> foo3 = new ArrayList<Number>();  // Number "extends" Number (in this context)
List<? extends Number> foo3 = new ArrayList<Integer>(); // Integer extends Number
List<? extends Number> foo3 = new ArrayList<Double>();  // Double extends Number
  1. Okuma- Yukarıda Olası ödevleri, ne tür bir nesnenin List foo3 okuma garantili misin: verilen

    • Bir okuyabilirsinizNumberfoo3 atanmış olabilir listelerinin çünkü herhangi bir Number Number bir alt sınıfı içerir.
    • foo3 List<Double> bir işaret olabilir çünkü Integer bir okuyamazsın.
    • foo3 List<Integer> bir işaret olabilir çünkü Double okuyamazsın.
  2. Yazma- Olası atamaları yukarıda verilen, ne tür bir nesnenin List foo3 ekler misiniz bu yasal olacaktümArrayList yukarıdaki Olası atamaları:

    • foo3 List<Double> bir işaret olabilir çünkü Integer ekleyemezsiniz.
    • foo3 List<Integer> bir işaret olabilir çünkü Double ekleyemezsiniz.
    • foo3 List<Integer> bir işaret olabilir çünkü Number ekleyemezsiniz.

Yapamazsın eklemek istediğiniz herhangi bir nesneye List<? extends T> çünkü yapamazsın garanti ne tür List gerçekten işaret etmek istiyorum, bu yüzden mi garanti nesne izin verilen bu List. Sadece" sadece okuyabilir ve T. T veya bir alt alacaksın "garantisi

super

Şimdi düşünün List <? super T >.

List<? super Integer> foo3 joker Bildirge, bu herhangi bir yasal işler anlamına gelir:

List<? super Integer> foo3 = new ArrayList<Integer>();  // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 = new ArrayList<Number>();   // Number is a superclass of Integer
List<? super Integer> foo3 = new ArrayList<Object>();   // Object is a superclass of Integer
  1. Okuma- Yukarıda Olası ödevleri, ne tür bir nesnenin List foo3 okuduğunuzda almak için garanti edilir: verilen

    • foo3 List<Number> List<Object> bir işaret olabilir çünkü Integer bir garanti yoktur.
    • foo3 List<Object> bir işaret olabilir çünkü Number bir garanti yoktur.
    • sadecegaranti bir örnek, bir alacak olmasıdırObjectya da alt Object (ama alt sınıf ne olduğunu bilmiyorsun).
  2. Yazma- Olası atamaları yukarıda verilen, ne tür bir nesnenin List foo3 ekler misiniz bu yasal olacaktümArrayList yukarıda Olası atamaları:

    • Integer yukarıdaki liste verilmez, çünkü Integer bir ekleyebilirsiniz.
    • Integer bir sınıfın bir örneği yukarıda listeleri izin verilir, çünkü Integer bir sınıfın bir örneğini ekleyebilirsiniz.
    • foo3 ArrayList<Integer> bir işaret olabilir çünkü Double ekleyemezsiniz.
    • foo3 ArrayList<Integer> bir işaret olabilir çünkü Number ekleyemezsiniz.
    • foo3 ArrayList<Integer> bir işaret olabilir çünkü Object ekleyemezsiniz.

PECS

UnutmayınPECS:"Yapımcı Uzanır, Tüketici Super".

  • "Yapımcı Genişletir"- Eğer ihtiyacın olan bir List üretmek T değerleri (okumak istiyorsun Ts liste), beyan ? extends T örneğin List<? extends Integer>. Ama bu listeye eklenemiyor.

  • "Tüketici Super"- Eğer ihtiyacın olan bir List tüketmek T değerleri (yazmak ister Ts içine listesi), beyan ile ? super T örneğin List<? super Integer>. Ama bu listeden okuyabilirsiniz ne bir garantisi yok.

  • Eğer okunur ve bir listesi için hem okuma hem de yazma için ihtiyacınız varsa, joker, örneğin List<Integer> tam olarak ile beyan etmek gerekir.

Örnek

Not this example from the Java Generics FAQ. Not nasıl Kaynak Listesi src (üretici listesi)* *79 ve hedef listesi dest (Alan Listesi) kullanır super kullanır:

public class Collections { 
  public static <T> void copy(List<? super T> dest, List<? extends T> src) 
  {
      for (int i=0; i<src.size(); i  ) 
        dest.set(i,src.get(i)); 
  } 
}

Ayrıca Bkz: How can I add to List<? extends Number> data structures?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fr. Eckle Studios

    Fr. Eckle St

    29 Kasım 2006
  • hanksranger

    hanksranger

    6 EKİM 2009
  • Videojug

    Videojug

    25 EKİM 2006