2013-05-13 2 views
1

두 키를 포함하는 사용자 지정 HashMap을 만들려고했습니다. 사용자가 KV의 두 매개 변수를 사용하여 클래스의 객체를 만듭니다. 클래스는 2 HashMaps : 기본으로 확장 된 <Integer, V>과 키 저장 <K, Integer>으로 구성됩니다. 기본적으로 각 값에 대해 2 개의 키가 있습니다 (KInteger).사용자 지정 다중 키 HashMap 만들기

사용자가 항목을 가져 오려면 K 키 또는 Integer 키를 사용하여 항목을 가져올 수 있습니다. 따라서, 예를 들어, 사용자는 시스템이 같은 키를 가진 정수 keyTable에 보이는 K를 사용하는 경우 다음 Integer 내가 그러므로 전에 파라미터를 해본 적이 있어요 V

public class KeyMap<K, V> extends ConcurrentHashMap<Integer, V> { 

    private HashMap<K, Integer> keyTable = new HashMap<K, Integer>(10); 

    @Override 
    public V get(Object key) { 
     if (key instanceof V) { 
      return super.get(keyTable.get(key)); 
     } 
     return super.get(key); 
    } 

} 

그러나 값을 찾을 것을 사용 I 문제가 무엇인지 이해할 수 없습니다. 온라인으로 Cannot perform instanceof check against type parameter V. Use instead its erasure Object instead since further generic type information will be erased at runtime을 받고 있습니다. if (key instanceof V) {.

원하는 시스템을 구현할 수 있습니까?

+1

하위 클래스를 지정하지 마십시오. 캡슐화하다. http://books.google.com/books?id=Ft8t0S4VjmwC&lpg=PR1&dq=effective%20java&pg=PA81#v=onepage&q=false –

+0

유형 삭제로 인해 'Class '인스턴스를 수락해야합니다. – SLaks

+0

bimap을 원합니다. http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/BiMap.html –

답변

1

런타임에 수행되는 모든 작업에서 매개 변수화 된 유형 (K 및 V)을 사용할 수 없습니다 (예 : instanceof 연산자). Java에서 모든 매개 변수화 정보는 컴파일 타임에 사용 된 다음 컴파일 된 코드에서 기본적으로 제거됩니다. 이 제거를 유형 삭제라고합니다. 1

어떤 HashMap을 사용할 것인지를 결정하기 위해 키의 유형에 의존하지 말고, 그 키가 첫 번째 HashMap의 유효한 키인지 아닌지 확인한 다음 두 번째 키만 사용해보십시오. K는 Integer 형식 일 수 있으므로 두 가지 키 유형이 동일 할 수 있습니다.

+0

키가 HashMap의 유효한 키인지 테스트하는 방법은 무엇입니까? –

+0

한 가지 방법은 HashMap의 containsKey (Object key) 메소드를 사용하는 것입니다. false가 돌려 주어 졌을 경우, 그 키에 관련 지을 수 있었던 값이 없기 때문에, 그 키는 그 HashMap에 유효하지는 않습니다. [link] (http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#containsKey%28java.lang.Object%29) –

+0

오, 가능하다면 무엇을 의미합니까? HashMap 키가 String 형인지 Integer 형인지를 검사한다. 예를 들어 String을 Integered Keys의 키로 사용하면 작동하지 않습니다. –