java süper kelime jenerik
Bu konuları inceledim
Ancak, ben yine de super
anahtar kelime ile kayıp gibi görünüyor:
Böyle bir toplama ilan ediyoruz
List<? super Number> list = null; list.add(new Integer(0));//this compiles list.add(new Object());//this doesn't compile
bunun tersi -
Number
ebeveynleri olan bazı nesneler (bilinmeyen) içeren bir liste var olmamalı.Object
uyarNumber
üst beri), veInteger
olmamalı. Tam tersi nedense böyledir.Aşağıdaki kodu olması koşuluyla
static void test(List<? super Number> param) { param.add(new Integer(2)); } public static void main(String[] args) { ArrayList<String> sList = new ArrayList<String>(); test(sList); //will never compile, however... }
İmkansız yukarıdaki kodu (ve akıl sağlığım bu doğru bir davranış olduğunu göstermektedir) derlemek için, ama temel mantık aksini ispat edebilir:
String is Object, Object is superclass of Number. So String should work.
Bu delilik ama
<S super T>
yapıları izin vermediler neden bu yüzden mi biliyorum? Evet, neden<? super T>
izin verilir?
Biri bana bu mantık zinciri eksik olan parçaları geri yüklemek için yardımcı olabilir mi?
CEVAP
List<? super Number>
sınırlı joker Number
ve supertypes herhangi yakalayabilir. Number extends Object implements Serializable
bunun için şu anda List<? super Number>
ile yakalama-Cabrio tek tip olduğu anlamına gelir:
List<Number>
List<Object>
List<Serializable>
add(Integer.valueOf(0))
yukarıdaki türlerden biri için unutmayın. ancak, senOLAMAZGenel tür güvenlik kuralı ihlal eden add(new Object())
List<Number>
List<Serializable>
beri.
DolayısıylaDEĞİLsadece ne kadar sınırlı olmadığını List<? super Number>
; joker ve yakalama dönüşüm çalışma add
Number
herhangi bir supertype bildiğiniz doğru. Object
eklemek isteyebilirsiniz, çünkü List<? super Number>
bir beyan yok (!); senin için Number
nesneleri "" Number
) ve List<Number>
çok kısıtlayıcı bir sadece. bir tüketici (yani eklemek istediğin için yap
Referanslar
- Angelika Langer's Generics FAQs
- What is a bounded wildcard?
- When would I use a wildcard parameterized type with a lower bound? ("beton parametrik yazın çok kısıtlayıcı olurdu.")
- Why is there no lower bound for type parameters? (bu mantıklı değil Çünkü".")
- JLS 5.1.10 Capture Conversion
Ayrıca Bkz
- Effective Java 2nd Edition Madde 28: sınırlı joker API esneklik artırmak için Kullanın
- "PECS yapımcı-
extends
tüketici-super
anlamına gelir
- "PECS yapımcı-
İlgili sorular
- Listelemek için çok fazla,,
new Integer(0)
vsvalueOf
, vb . PECS
Jenerik Java: PECS Nedir?...
Java mı anahtar kelime iddia, ne yapar...
Liste<Köpek> Listenin alt<Hay...
Hiç Java geçici anahtar kelime kullanı...
Neden süper.süper.() metodu, Java İzin...