2014-10-05 3 views
0

이 항목에 대한 몇 가지 질문을 보았지만 여전히이 문제를 해결하는 방법을 알 수 없습니다. 나는 변수를 다음과 같이 정의하고 초기화한다 :중첩 된 제네릭 및 와일드 카드

Queue<? extends Map<String, String>> q = new LinkedList<HashMap<String, String>>(); 

그리고 컴파일한다. 하지만 :

Map<String, String> m = new HashMap<String, String>(); 
m.put("foo", "bar"); 
q.add(m); 

은 컴파일 오류 : no suitable method found for add(Map<String,String>)을보고합니다.

편집 :

내가 제네릭이 질문에 중첩되지 않기 때문에이, Can't add value to the Java collection with wildcard generic type 서로 다른 생각합니다.

또한, 허용되는 대답은 템플릿 클래스의 특정 구현을 일부 선언에서 생략 할 수 있다고 설명합니다. 이 교훈은 중복 된 것으로 표시된 질문에서 찾을 수 없습니다.

답변

0

?은 "알 수없는 유형"을 의미합니다. 형식을 알 수 없으므로 컴파일러에서 형식이 Map<String, String>임을 보장 할 수 없습니다. 따라서 유형 안전을 손상시킬 수 있으므로 대기열에 아무 것도 추가 할 수 없습니다.

귀하의 변수를 선언해야 또는

Queue<Map<String, String>> q = new LinkedList<Map<String, String>>(); 

단순히 당신이 자바 7에있어 ​​이상

Queue<Map<String, String>> q = new LinkedList<>(); 
+0

굉장 경우! 당연하지! 나는이 시점에서지도 구현의 선언을 연기 할 수 있다는 것을 몰랐다. 고맙습니다. – clapas