2014-11-06 4 views
0

내가 노드 클래스가 객체 생성. 나는 목록자바는 일반의지도

public MyClass extends MySuperClass{ 

} 

    Map<Long, Node<MyClass>> myMap = new HashMap<Long,Node<MyClass>>(); 

    tree.add(myMap); 

컴파일러는 나에게 다음과 같은 메시지를 제공에 맵의 인스턴스를 추가 할 때 나는이

List<Map<Long, Node<? extends MySuperClass>>> tree = new ArrayList<Map<Long, Node< extends MySuperClass>>>(); 

같은 것을 작성해야 :

The method add(Map<Long,Node<? extends MySuperClass>>) in the type List<Map<Long,Node<? extends MySuperClass>>> is not applicable for the arguments (Map<Long,Node<MyClass>>) 

구문 적으로 그것을 맞다. 왜 작동하지 않는지 나는 이해할 수 없다.

+0

내 나쁜 대답은 –

+1

당신은이 라인'지도 <롱, 노드 >에는 myMap = 새로운 ArrayList를 <롱, 노드 >'를 해결시겠습니까 .. 지금 생각하려고, 벗어났다? 당신이 정말로 거기에서 사용하는 것을 씁니다. – Tom

+0

@Tom yea 그건 나를 괴롭혔다. 그러나 Map (인터페이스 또는 클래스 ??)에서 메서드를 사용하려고하지만 배열 목록을 원한다면 어떻게 될까? –

답변

2

귀하의지도는 귀하의 목록과 동일한 유형으로 정의되어야합니다.

List에 유형이 Map<Long, Node<? extends MySuperClass>>으로 예상되기 때문입니다. 유형 Node<? extends MySuperClass>Node<MyClass>은 동일하지 않습니다.

http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html에서 참고 주어 두 구체적인 유형 A와 B (예, 번호 정수) MyClass<A> 무관 의 A와 B가 관련되어 있는지의 여부, MyClass<B>는 관계가 없다. MyClass<A>MyClass<B>의 공통 상위는 Object입니다.

참고 : 다른 생성자에 대한 매개 변수를 입력하지 않으려 고하기 때문에 기본 네임 스페이스를 Node 클래스에 추가하여 다음 네 줄을 컴파일하면됩니다.

List<Map<Long, Node<? extends MySuperClass>>> tree = new ArrayList<Map<Long, Node<? extends MySuperClass>>>(); 
Map<Long, Node<? extends MySuperClass>> myMap = new HashMap<Long, Node<? extends MySuperClass>>(); 
myMap.put(1L, new Node<MyClass>()); 
tree.add(myMap); 
+0

젠장 ... 천천히. – LostKatana

+0

OP는 A와 B 사이의 상속 관계가 구체적인 유형이 아닌 경계가있는 와일드 카드에 의해 생성된다는 사실에 의해 혼동 될 수 있습니다 (http://docs.oracle.com/javase/tutorial/java/generics/ 참조). subtyping.html). 여전히 관계가 어떻게 발생했는지는 중요하지 않습니다. 여전히 고려되지 않았습니다. – Arkadiy