2009-08-27 9 views
3

나 종류자바 제네릭/상속

HashMap<Integer, HashMap<Integer, Police>> time_id_police; 
HashMap<Integer, HashMap<Integer, Ambulance>> time_id_ambulance; 

두 HashMaps을가있는 경우 여기서 경찰 및 구급차 두 구조를 확장 제가이 방법에

HashMap<Integer, HashMap<Integer, Rescue>> getRescue(){ 
    if (a) return time_id_police; 
    else return time_id_ambulance; 
} 

도 이와 같은 방법에있어서, 반환 유형을

HashMap<Integer, HashMap<Integer, ? extends Rescue>> 

으로 변경하지 마십시오.

감사합니다.

답변

3

분명히 HashMap<Integer, HashMap<Integer, Rescue>> 잘못이 아니라 여러 곳에서보다 (당신이 당신의 객체를 실체화) 한 곳에서 변경을해야은 HashMap<Integer, Ambulance>입니다. Rescue? extends Rescue으로 바꾼 경우에도 이와 유사한 작업을 수행 할 수 있습니다.

그러나 ? extends을 두 번 사용하면 유형 시스템이 손상되지 않습니다.

HashMap<Integer, ? extends HashMap<Integer, ? extends Rescue>> getRescue() { 

대부분의 자바 프로그래머는 오히려 특정 구현보다 종류 Map 더 일반적인를 사용하는 것을 선호합니다. 당신은보다 간결 삼항 연산자를 사용하도록 방법을 몸을 변경하는 경우

Map<Integer, ? extends Map<Integer, ? extends Rescue>> getRescue() { 

덧붙여, : 컴파일러가 당신을 위해 유형을 작품으로

return a ? time_id_police : time_id_ambulance; 

당신은 약간 더 도움이 오류 메시지가 :

R.java:18: incompatible types 
found : java.util.HashMap<java.lang.Integer,capture of ? extends java.util.HashMap<java.lang.Integer,? extends Rescue>> 
required: java.util.HashMap<java.lang.Integer,java.util.HashMap<java.lang.Integer,Rescue>> 
    return a ? time_id_police : time_id_ambulance; 
     ^
1 error 
+0

내가 원했던 것. 실제 맵은 5 레벨 깊이이기 때문에 다소 장황하다 :) 감사합니다. –

+0

정확히 무엇을하고 있는지 알지 못하지만 키 객체를 소개 할 가치가 있을지도 모릅니다. 사용하려는 fives 키를 구성하는 단일 객체 귀하의 중첩 된지도. –

0
경우에만거야, 당신은 또한 당신이 이제까지 사용하는지도의 구현을 변경하려는 경우 대신 HashMap의지도,이 방법으로 그것들을 선언 할 수 있습니다

HashMap<Integer, HashMap<Integer, Rescue>> time_id_police; 
HashMap<Integer, HashMap<Integer, Rescue>> time_id_ambulance; 

에 time_id_police 및 time_id_ambulance 당신의 선언을 변경

(당신이 당신의 개체를 사용하는 경우) 다음 값이교체 될 수 있기 때문에

Map<Integer, Map<Integer, Rescue>> time_id_police = new HashMap<Integer, HashMap<Integer, Rescue>>(); 
+0

이러한 변경 사항을 통해 구급차를 time_id_police에 넣지 않았는지 어떻게 확인할 수 있습니까? – Zed

+0

'time_id_ * '유형이 잘못되었습니다 ... –

+0

@Zed, 할 수 없습니다. 최선의 해결 방법은 경찰 및 구급차 모음 사용자의 구현 세부 사항을 숨기는 래퍼 클래스를 만드는 것일 수 있습니다. – Glen