2016-09-18 2 views
0

generacy를 사용하여 키와 값 사이에 형식 관계를 적용하는 맵 래퍼를 구현하려고합니다. 다음 코드는 컴파일되지 않습니다 :중첩 된 구조로 컴파일되지 않는 일반 맵

Map<Class<? extends Serializable>, List<List<? extends Serializable>>> collection = new HashMap(); 

private <T extends Serializable> void add(Class<T> type, List<List<T>> item) { 
    collection.put(type, item); 
} 

을이 컴파일 반면 :

Map<Class<? extends Serializable>, List<? extends Serializable>> collection = new HashMap(); 

private <T extends Serializable> void add(Class<T> type, List<T> item) { 
    collection.put(type, item); 
} 

왜 제 2, 제 3 수준의 제네릭 형식 사이에 차이가?

+0

도 본질적으로 같은 몇 가지 다른 질문이 있습니다 - 제안 속는 내가 그 답을 발견 그 중 하나입니다 나는 최고라고 생각한다. –

+0

원시 형식을 사용하지 마십시오. – shmosel

답변

2

제네릭 불변 있으며,지도의 두 번째 유형 매개 변수는 put의 두 번째 인수가이 정확히 일치해야 의미, List<List<? extends Serializable>>입니다. 그것은 정확한 매개 변수 List<? extends Serializable>이있는 경우

즉 당신은지도에 List을 추가 할 수 있으며 T정확히 ? extends Serializable 없습니다.

당신은 당신의지도 및 방법 선언의 다른 ? extends를함으로써이 문제를 해결할 수 있습니다

Map<Class<? extends Serializable>, List<? extends List<? extends Serializable>>> collection = new HashMap<>(); 

private <T extends Serializable> void add(Class<T> type, List<? extends List<T>> item) { 
    collection.put(type, item); 
} 
관련 문제