2009-09-21 3 views
9

는, Map 인터페이스는Java Generics : Map.get()이 형식을 무시하는 이유는 무엇입니까? 자바에서

public interface Map<K,V> { 
    ... 
    V get(Object key); 
    ... 
} 

왜,로 정의된다?

V get(K key); 

잘못된 유형의 키가 사용 되었기 때문에 나는 불쾌한 버그에 부딪 혔습니다. 제네릭의 목적은 컴파일하는 동안 형식 오류를 조기에 잡는 것이라고 생각했습니다. 이것이 그 목적을 이길 수 있습니까?

+0

[좋은 이유는 Map.get (Object key)가 (완전히) generic이 아닌 이유는 무엇입니까?] http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-notfully-generic) – NickDK

답변

9

케빈 부리 리온 blogged about this 얼마 전에. 요약 :

균일하게, 자바 컬렉션 프레임 워크 (너무 구글 컬렉션 라이브러리) 자신의 매개 변수가 고장 나지 에게 컬렉션을 방지하기 위해 필요한 때를 제외하고 의 유형을 제한하지 방법.

개인적으로 나는 그 접근법의 팬이 아니지만, 또한 취해진 분산 접근법을 감안할 때 약간의 의미가 있습니다.

-3

@subtenante에 추가하려면 Java가 항상 하위 호환성을 갖도록 설계되었습니다. Generics는 잘못된 유형의 put을 허용하지 않습니다. 이것은 하위 호환성을 손상시키지 않기 때문입니다. 올바른 키가 사용되고 있는지 확인하는 쉬운 방법은이 작업을 수행하는 것입니다.

K key = null; 
V value = null; 

Map<K,V> mapped = new HashMap<K,V>() 
.......//set the key and value.......... 
mapped.put(key, value) 
..... 
V var = mapped.get(key); 

문제가 해결되었습니다.
제네릭에 대한 한 가지 추가주의 사항으로, 클래스의 하위 항목도 컬렉션에 배치 할 수 있습니다.

Number k= null; 
Number v= null; 

Map<Number,Number> mapped = new HashMap<Number,Number>() 
.......//set the key and value.......... 
k = double someDouble; 
v = int someInt; 
mapped.put(k, v) 
..... 

이로 인해 큰 버그가 발생할 수 있습니다 !!

+0

정말 지우개가이 부분에 들어오는 지 모르겠다. 소실은 "안전하지 않은"작업을 수행하는 경우에만 문제가됩니다. –

+0

Put()은 제네릭 형식을 사용합니다. 나는 단지 얻을에 관하여 불평하고있다. –

+0

@ZZ Coder, 나는 코드의 최상위 세트에서 get을 다루었습니다. 두 번째 세트는 제네릭을 사용하는 또 다른 공통 문제를 지적했습니다. – WolfmanDragon

3

한 유형의 대상은 다른 유형의 대상과 .equals() 일 수 있습니다. get() 당신이주고있는 객체가 .equals()이되어야합니다.

+0

이것은 사실이 아닙니다. 형식이 일치해야하므로 ClassCastException이 발생합니다. –

+7

ClassCastException이 발생하면 equals()가 제대로 구현되지 않습니다. 유형이 호환되지 않는 경우 false를 반환하는 것이 좋습니다. – finnw

관련 문제