2012-07-16 5 views
8

저는 키가 제네릭 종류 Key<T>이고 값은 List<T>입니다. 키가 Key<String>의 인스턴스 인 경우이 값은 List<String>이어야하며 동일한 규칙이 다른 키 - 값 쌍에도 적용됩니다. 나는 다음을 시도했지만 그것은 컴파일되지 않습니다 :이 나쁜하지만 현재 더 좋은 선택의 여지가 알고generics 변수를 사용하여지도를 선언하는 방법은 무엇입니까?

Map<Object, List> map; 

: 현재

Map<T, List<T>> map; 

내가 "부분"제네릭을 선언해야 . 이 상황에서 제네릭을 사용할 수 있습니까?

UPDATE은 어쩌면 내가 분명히 내 문제를 표현하지 않았다. , 일반 유형 중 하나가 될 수있는 반면, 키와 값이 동일한 제네릭 형식을 항상 있어야한다

map.put(new Key<String>(), new ArrayList<Integer>()); 

:

map.put(new Key<String>(), new ArrayList<String>()); 
map.put(new Key<Integer>(), new ArrayList<Integer>()); 

그리고 다음 코드는 컴파일되지해야합니다 내가 할 수있는지도를 원하는 그리고 분명히지도를 확장하는 것이 나의 요구 사항을 충족시키지 못합니다.

+0

공백은 문제가되지 않습니다. 가능성이 높습니다. OP가 수정해야 할 코드가 더 필요합니다. – Nishant

+0

'T'유형의 키 또는 ''유형의 키를 사용하고 있습니까? –

+0

실제 시나리오에서는 Nishant와 Geoff가 답변에 캡슐화를 사용하여 문제를 해결하고이를 실제 코드에 적용하면됩니다. –

답변

7

저는 정확히 이것을 수행하는 기존의 라이브러리에 대해서는 알지 못하지만 구현하기가 너무 어렵지 않습니다. 나는 과거에 비슷한 것을 몇 번이나 해왔다. 표준 Map 인터페이스는 사용할 수 없지만 내부에 해시 맵을 사용하여 클래스를 구현할 수 있습니다. 시작하려면 다음과 같이 표시 될 수 있습니다.

public class KeyMap { 
    public static class Key<T> { } 

    private final HashMap<Object,List<?>> values = new HashMap<Object,List<?>>(); 

    public <T> void put(Key<T> k, List<T> v) { 
    values.put(k, v); 
    } 

    public <T> List<T> get(Key<T> k) { 
    return (List<T>)values.get(k); 
    } 

    public static void main(String[] args) { 
    KeyMap a = new KeyMap(); 
    a.put(new Key<String>(), new ArrayList<String>()); 
    a.get(new Key<Integer>()); 
    } 
} 
+0

실제로'지도 >지도'를 다른 클래스에 배치하고 있습니다.단순한지도가 내 요구 사항을 충족시키지 못해서 이것이 마지막 선택 일 수 있습니다. 고맙습니다! –

4

이것은 당신이 원하는 것입니다 : 당신은 슈퍼 클래스로는 HashMap을 원하지 않는 경우

public class Test<T> extends HashMap<T, List<T>> 
{ 
} 

다음 원하는 구체적인 어떤 클래스로 변경.

+0

제 업데이트를 참조하십시오. –

+0

답변을 변경했습니다. – Brad

+0

하지만 어떻게 데이터를 저장하기 위해 하나의'Test' 인스턴스 만 사용할 수 있습니까? –

관련 문제