≪ 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
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
Okuma- Yukarıda Olası ödevleri, ne tür bir nesnenin
List foo3
okuma garantili misin: verilen- Bir okuyabilirsiniz
Number
foo3
atanmış olabilir listelerinin çünkü herhangi birNumber
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.
- Bir okuyabilirsiniz
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
Okuma- Yukarıda Olası ödevleri, ne tür bir nesnenin
List foo3
okuduğunuzda almak için garanti edilir: verilenfoo3
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ır
Object
ya da altObject
(ama alt sınıf ne olduğunu bilmiyorsun).
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
üretmekT
değerleri (okumak istiyorsunT
s liste), beyan? extends T
örneğinList<? extends Integer>
. Ama bu listeye eklenemiyor."Tüketici Super"- Eğer ihtiyacın olan bir
List
tüketmekT
değerleri (yazmak isterT
s içine listesi), beyan ile? super T
örneğinList<? 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?
'kamu, varsayılan olarak korumalı...
Yumuşak bir referans ve Java zayıf bir...
Kurallı, isim, basit isim ve Java Ders...
'getPath arasındaki fark ne(), ge...
Neden süper.süper.() metodu, Java İzin...