2013-04-12 17 views

cevap

10

Bu

List<Animal> list = new ArrayList<Dog>(); 

parametreli türü gibi benzer hata iki ucunda aynı tip gerektiğidir. Miras (IS-A) kavramı yoktur. Eğer hala kullanmak istiyorsanız, sadece eşittir işaretinin sol tarafında izin verilen genişletilmiş/süper anahtar kelime ile joker (?) Kullanın. Biri Cat eklemek çalışırsa daha sonra başarısız ve atış istisna olacak

List<Animal> list = new ArrayList<Dog>(); // is not allowed 

ama

Animal[] animal = new Dog[10]; //is allowed 
animal[0] = new Dog(); // is allowed 

nesneyi (Hayvan uzanır).

animal[1] = new Cat(); //compiles fine but throws java.lang.ArrayStoreException at Runtime. 

animal[1] veya animal[index]Köpek reference tutuyor unutmayın. Bu nedenle Dog referans değişkeni, Cat nesnesini değil Dog nesnesini ifade edebilir. Bu nedenle, böyle bir senaryoyu önlemek için JSL, jenerikler listesinde/Koleksiyonda bu değişiklikleri yapmıştır. Bu cevap sizin sorunuz için de geçerlidir (Map).
Parametreli tür her iki uçta da aynı türde olmalıdır.

List<Animal> list = new ArrayList<Animal>(); 
20

Genel değerler eşdeğerli değildir. Sen kullanabilirsiniz: atamanın dış sol taraftaki Map "haline" mümkün olmakla birlikte

Map<Integer, Map<String, Integer>> myMap = new HashMap<Integer, Map<String, Integer>>(); 
^                ^
--------------^------------------- becomes ------^    | 
       -----------------must remain as type --------------- 

atanmış gibi bir HashMap, aynı jenerik parametreleri olarak görünen her türlü uygulanamaz.

Düzenleme: Bu sözdizimi girişleri haritaya eklenmesine izin ver ama bir olarak yararlıdır olmaz

Map<Integer, ? extends Map<String, Integer>> myMap = new HashMap<Integer, HashMap<String, Integer>>(); 

Not: @Keppil tarafından belirtildiği gibi

, sen sınırlı joker sözdizimi kullanabilirsiniz ve yöntemlerden geçirilecek yazın.

Bazı referanslar:

+3

sol tarafta ? extends Map<String, Integer> olmalı? Harita > myMap = new HashMap >() uzanır; ' – Keppil

+2

@Reimeus biraz daha açıklama benim için yararlı olacaktır .. –

2

bu deneyin:

Map<Integer, HashMap<String, Integer>> myMap = new HashMap<Integer, HashMap<String, Integer>>(); 
3

Eğer t gibi bir şey gerekiyor onun:

Map<Integer, Map<String, Integer>> myMap = new HashMap<Integer, Map<String, Integer>>(); 
myMap.put(1, new HashMap<String, Integer>()); 
6

deneyin bu

Map<Integer, ? extends Map<String, Integer>> myMap = new HashMap<Integer, HashMap<String, Integer>>(); 

Daha sonra size Tamsayılar

ait HashSet bir çift eklemek çünkü,

Set<Number> set = new HashSet<Integer>(); 

izin verilmeyen basit bir örnek üzerinde açıklamak daha problemsiz oluyor

set.add(1.0) 

Not inci

Set<? extends Number> set = new HashSet<Integer>(); 

de sete null ama bir şey eklemek izin vermez. Ama sadece burada http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

3

Map<String, Integer>HashMap<String, Integer> aynı değildir Sen daha fazla bilgi bulabilirsiniz bunun

Numaralar'ı okuyabilir. İşte sorun bu.

Aslında HashMap Harita arabirimini uygular. Bu yüzden de `Harita

İlgili konular