2013-07-18 9 views
4

자바 예를 들어, <? extends class>하여이 경우 빌드 새의 HashMap를 사용할 수있는 자바 클래스를 필터링하는 방법을 나에게 제공 >> 직렬화 :Map <String, Class <? 확장

내가 할 수있는 :

Map<String,? extends Serializable> map1 = new HashMap<String,String>(); 

String은 Serializable을 구현하기 때문에 컴파일러가 올바르게 처리 할 수 ​​있습니다.

하지만 난 그렇게하려고하면

Map<String,GenericClass<? extends Serializable>> map2 = new HashMap<String, GenericClass<String>>(); 

는 그것으로 GenericClass 인 :

public class GenericClass<T> 
{ 
. 
. 
. 
} 

컴파일러가 말하는 오류가 발생 :

Type mismatch: cannot convert from HashMap<String,GenericClass<String>> to Map<String,GenericClass<? extends Serializable>> 

싶습니다에 있잖아, 무슨 일이야?

아마도 컴파일러는 확장 클래스를 제네릭 형식의 일부로 검색 할 수 없습니다.

+0

것은 프로그래머 실종>에서 '새의 HashMap <문자열, GenericClass ();' –

+0

내가 잘못 자바 중첩 [의 – Ivan

+0

중복 가능성을 편집 붙여 미안 와일드 카드 제네릭 컴파일되지 않습니다] (http://stackoverflow.com/questions/3405866/java-nested-wildcard-generic-wont-compile) –

답변

2

다음 사용해야합니다 :

Map<String, ? extends GenericClass<? extends Serializable>> map2 = 
     new HashMap<String, GenericClass<String>>(); 

중첩 된 와일드 카드는 최고 수준의 와일드 카드는 다른 많은있다 - 오직 후자는 wildcard capture을 수행합니다. 결과적으로 HashMap<String, GenericClass<String>>GenericClass<? extends Serializable>이 구체적인 유형 인수이므로 (및 generics aren't covariant이기 때문에) Map<String, GenericClass<? extends Serializable>>으로 변환 할 수없는 것으로 간주됩니다.

하는 중첩 된 와일드 카드에 대한 자세한 내용은이 게시물을 참조하십시오 : Multiple wildcards on a generic methods makes Java compiler (and me!) very confused

+0

대단히 감사합니다. – Ivan

1
Map<String,? extends Serializable> map1 = new HashMap<String,String>(); 

map1Serializable 년대의 알 수없는이 필요한 억제 할V가 포함되어 있습니다. 따라서 null을 제외하고는이를 바인딩 할 객체를 찾을 수 없습니다.

Map<String,GenericClass<? extends Serializable>> map2 = new HashMap<String, GenericClass<String>>(); 

map2과는 V (Class<? exends Serializable) (이 경우에 String) 형태로 K 경계 이다. 이것이 Java 컴파일러가 경계를 보는 방법입니다.

본질적으로 map1.put(String key, null value) //Compiler is asking WTF here 만 볼 수 있으므로 은 null을 제외하고 map1에있는 모든 것을 사용할 수 없습니다. 반면에 map2은 본질적으로 map2.put(String key, Class<? extends Serializable> value); //Much better...으로 "렌더링"됩니다.

map2에 있기 때문에 서명은 선언에서 동일해야합니다.

+0

이것은 질문에 대답하지 않습니다. –

관련 문제