2009-07-17 5 views
2

이것은 바보 같은 질문처럼 보입니다. 그러나 나는 그 순간에 넘어지고 있습니다. 이것은 왜 컴파일됩니까?왜이 코드는 제네릭과 함께 컴파일됩니까?

import java.util.*; 

public class Test { 
     public static void main (String[] argv) throws Exception { 
       Map<String,String> map = new HashMap<String,String>(); 
       map.get(new ArrayList<String>()); 
     } 
} 

"String"과 호환되지 않는 항목으로 get을 호출하면 안됩니까?

+0

FindBugs를 실행하면 get()에 사용 된 잘못된 객체 유형에 대해 불만을 표시합니다. – akarnokd

+0

Asker로서 나는 다음과 같은 속임수로 투표를 끝내기로 동의합니다 : http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully- 일반 – jsight

+0

+ 나를 가까이에서. – akarnokd

답변

1

Map에 대한 Javadoc과에서 또한 this this

+2

링크를 제공 할 때 문맥을 제공해야합니다. –

+0

링크를 제공해 주셔서 감사합니다. 그 이유는 기본적으로 API를 더 고통스럽게 만드는 대신에 하위 호환성을 원했기 때문입니다. 안타깝게도, 이것은 제네릭으로의 변환을 훨씬 쉽게하기보다는 많은 경우에 더 어렵게 만듭니다. – jsight

+0

Duly 지적했다 ... 나는이 질문이 지금 닫힌 것으로 투표로 결정 되었기 때문에 편집하지 않을 것이다 –

3

참조 :

V get(Object key) 

이지도가 매핑을 보관하지 경우하여 지정된 키가 매핑되는 값을 돌려줍니다 키.

get은 단순히 ANY 객체를 가져 와서 (있는 경우) 객체에 매핑 된 객체를 반환합니다. 따라서 문자열을 전달하는 것은 합법입니다. 그러나 모든 키가 문자열이어야하므로 문자열이 아닌 문자열을 전달할 경우 항상 null이됩니다.

+2

나는 당신이 "항상"null을 얻는다는 것을 의미한다라고 생각한다. :) – jsight

+0

하하, 죄송합니다. 고쳐 줘서 고마워. – Falaina

+0

OP에 1.5 구문을 사용하는 동안 1.4.2 문서에서 인용하고 있습니다. –

1

Mapget() 방법은 일반 유형 K이 아닌 Object을 사용합니다.

코드가 컴파일되지만 맵에서 아무것도 얻지 못합니다.

1

Map.get은 일반 유형이 아니라 Object입니다. documentation.

get(Object key) : 지정된 키가 매핑되는 값을 반환하거나,이 맵에 키 매핑이없는 경우 null을 반환합니다.

중요한 점은 제네릭 형식을 반환하므로 반환 값을 캐스팅하지 않아도된다는 것입니다.

관련 문제