2013-04-12 5 views

답변

10

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

파라미터 화 된 형태는 유사한 오류가 양단부에서 동일한 유형이어야한다. 상속 (IS-A) 개념은 없습니다. 그래도 사용하고 싶다면 와일드 카드 (?)를 extend/super 키워드와 함께 사용하십시오.이 키워드는 등호 왼쪽에서만 허용됩니다. 누군가가 Cat를 추가하려고하면 나중에 실패하고 던져 예외 것

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

하지만

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

객체 (동물을 확장).

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

animal[1] 또는 animal[index]이 개 reference 들고있다 기억하십시오. 따라서 Dog 참조 변수는 Dog 개체가 아닌 Cat 개체를 참조 할 수 있습니다.

그런 시나리오를 피하기 위해 JSL은 generics list/Collection에서 이러한 변경을 수행했습니다. 이 대답은 귀하의 질문 (Map)에도 적용됩니다.
매개 변수화 된 형식은 양쪽 끝에 같은 형식이어야합니다.

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

제네릭은 동일 변종이 아닙니다. 당신은 사용할 수 있습니다 : 과제의 외부 왼쪽에있는 Map는 "가"수 있지만

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

할당으로 HashMap은 동일한 제네릭 매개 변수로 나타나는 유형에 적용 할 수 없습니다.

편집 :이 구문은 항목이지도에 추가 할 수 있지만으로 유용하지 않습니다

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

주 : @Keppil에서 언급 한 바와 같이

, 당신은 경계 와일드 카드 구문을 사용할 수 있습니다 메소드와주고받는 타입.

일부 참조 :

+3

'Map > myMap = new HashMap >(); ' – Keppil

+2

@Reimeus 더 많은 설명이 도움이 될 것입니다. –

2

이 시도 :

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

당신이 t 같은 뭔가가 필요 그의 :

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

는 시도이

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

다음 정수

의 HashSet의에 두 번을 추가 할 수 있기 때문에,

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

이 허용되지 않는 간단한 예제를 설명하는 easer입니다

set.add(1.0) 

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

에 세트에 null 아무것도하지만를 추가 할 수 없습니다. 그러나 당신은 단지 여기 http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

3

Map<String, Integer>HashMap<String, Integer>과 동일하지 않습니다 당신은 더 많은 정보를 찾을 수 있습니다 그것은

에서 숫자를 읽을 수 있습니다. 그것이 문제이다.

사실 HashMap은 맵 인터페이스를 구현합니다. 따라서 왼쪽에 ? extends Map<String, Integer>이어야합니다.

관련 문제