2013-08-19 5 views
-1

ConcurrentHashMap의 사용을 광산 CaseInsensitiveConcurrentHashMap으로 바꾸려고합니다. 그러나, 나는 hashmap을 인스턴스화 할 수 없다. 나는 나의 구현을 제공 할 것이다.Java에서 ConcurrentHashMap 대/소문자를 구분하지 않는 키 집합을 만들 수 있습니까?

해시 맵 클래스 - SO 질문에서 기반 : https://stackoverflow.com/a/8237007/850475

import java.util.concurrent.ConcurrentHashMap; 

public class CaseInsensitiveConcurrentHashMap <T> extends ConcurrentHashMap<String, T>{ 

    @Override 
    public T put(String key, T value) { 
     return super.put(key.toLowerCase(), value); 
    } 

    public T get(String key) { 
     return super.get(key.toLowerCase()); 
    } 
} 

그리고 그 아래에있는 내 코드는 새로운 해시지도가 작동하지 않습니다 : tester에서

public class tester { 
    private static ConcurrentMap<String, SomeClass> items = new CaseInsensitiveConcurrentHashMap<String, SomeClass>(); 
    private static ConcurrentMap<String, CaseInsensitiveConcurrentHashMap<String, Collection<SomeClass2>>> tagMap = new CaseInsensitiveConcurrentHashMap<String, CaseInsensitiveConcurrentHashMap<String, Collection<SomeClass2>>>(); 
} 

두 라인은 실패합니다.

Incorrect number of arguments for type CaseInsensitiveConcurrentHashMap<T>; it cannot be parameterized with arguments <String, Collection<SomeClass>>

내가 시도 할 수 있습니다 무엇으로 어떤 생각이 내 오류 메시지가 무엇입니까?

+0

는 (은'String's 제거) 그것을 하나를 통과해야하므로 귀하의지도는, 단 하나 개의 형식 매개 변수를했다 – kiheru

+1

이 수 사용하여 인스턴스화한다 get 메소드가 Map.get()을 오버라이드하지 않기 때문에 호출되지 않을 것이라는 점을 알고 있어야합니다. ConcurrentHashMap의 다른 put 메소드도 대체해야합니다. –

답변

3

CaseInsensitiveConcurrentHashMap은 값에 대해 하나의 일반화 된 매개 변수가 있습니다, 그래서 new CaseInsensitiveConcurrentHashMap<SomeClass>()

+0

'String'으로 제네릭 클래스를 색인할까요? –

+0

@StephenD'ConcurrentHashMap '을 확장함으로써,'CaseInsensitiveConcurrentHashMap'는 이미 키에 대한 타입 인자로서'String'을 제공합니다. –

+1

예, 대소 문자를 구분하지 않는 키를 사용해야합니다. 또한 모든 메소드가 재정의 된 put() (예 : putAll)을 자체적으로 사용할 것인지 확신 할 수 없으므로 상속에 비해 컴포지션을 사용하는 것이 훨씬 더 나은 방법입니다. – cyberz

3
class CaseInsensitiveConcurrentHashMap <T> 

해시 맵은 단일 일반 매개 변수를 사용합니다.

따라서이 매개 변수를 사용할 때는 하나의 일반 매개 변수 만 전달해야합니다.

+0

'String'에서'T' 키 값 쌍으로이 새 맵을 어떻게 초기화 할 수 있는지 예를 들어 주시겠습니까? –

+0

@StephenD : 당신은 무엇을 이해하지 못합니까? – SLaks

+0

글쎄, 정규 ConcurrentMap을 초기화하면, ''이 아닌' '로 초기화 할 수 있습니다. –