2010-01-14 5 views
1

구글 컬렉션을 사용하기 전에 나는 다음 코드와 유사한했다 :Google 컬렉션 'Multimap <?, Object>을 통해 반복하는 방법은 무엇인가요?

private Set<A> aSet = ...; 
private Set<B> bSet = ...; 

public Foo getFoo (Map<?, List<Bar>> bars, Set<?> set) { 
    for (Object item : set) { 
     for (Bar bar : bars.get (item)) { 
      //build foo; 
     } 
    } 
    ... 
} 

와 나는이 같은 전화를 걸 수 있었다 : 나는 할 수 없어, 같은 Multimap과 함께, 이제

Map<A, List<Bar> aMap = getAMap(); 
Foo f1 = getFoo (aMap, aSet); 
Map<B, List<Bar> bMap = getBMap(); 
Foo f2 = getFoo (bMap, bSet); 

을 :

public Foo getFoo (Multimap<?, List<Bar>> bars, Set<?> set) { 
    for (Object item : set) { 

     // compile error: get(capture#621 of ?) in Multimap ... cannot be applied to java.lang.Object 
     for (Bar bar : bars.get (item)) { 
      //build foo; 
     } 
    } 
    ... 
} 

답변

8

이 시도 :

public <T> Foo getFoo (Multimap<T, List<Bar>> bars, Set<T> set) { 
    for (T item : aSet) { 

     // compile error: get(capture#621 of ?) in Multimap ... cannot be applied to java.lang.Object 
     for (Bar bar : bars.get (item)) { 
     //build foo; 
     } 
    } 
    ... 
} 

편집 :

당신이 두 클래스를위한 Javadoc을 참조하면지도를위한 Javadoc가 있음을 알게 될 것이다 :

V get(Object key) 

및 Multimap과를위한 것입니다

Collection<V> get(K key) 

는 것을 참조 지도에 대한 매개 변수가 생성되지 않습니다.

MultiMap은 일반용으로 더 좋지만 맵은 Java 1.4의 이전 Map과 호환되도록 설계되었습니다.

+1

예, 작동합니다. 그러나 나는 왜 우리가 을 지정할 필요가 있는지 이해하지 못합니까? – Roman

+0

T는지도의 집합과 키의 요소가 동일한 유형인지 확인합니다 – nanda

+3

다시 가져온 컬렉션이 멀티 맵 자체에 "연속 기입"이기 때문에 멀티 맵에서 키의 유형이 올바른지 확인해야합니다. (즉, 요소를 추가 할 수 있고 해당 항목이 멀티 맵에 표시되고 키가 잘못된 유형 인 경우 데이터가 손상되었을 수 있습니다). Map에는 그러한 걱정이 없으며 get()에 매개 변수 유형으로 Object를 사용할 때 절대적으로 옳습니다. –

관련 문제