2009-11-25 6 views
0

가능한 중복은 :
What are the reasons why Map.get(Object key) is not (fully) generic여러 java.util.List 메소드가 type 매개 변수를 사용하지 않는 이유는 무엇입니까?

이 java.util.Map에 질문 here 유사하다. 이 질문은 그 질문에 대한 포인터로 남아 있습니다.

boolean contains(Object o) 
int lastIndexOf(Object o) 
boolean remove(Object o) 

내가 유형을 사용하도록 이러한 방법을 기다리고 있었다 : 제네릭과 같은 자바 5에 도입 된 후


List 인터페이스는 여전히 매개 변수로 객체를 받아 여러 가지 방법을 포함 매개 변수. 이런 식으로 뭔가 : 비록

boolean contains(E e) // Where the interface is defined as List<E> 

, 그것은 것은 <? extends E> 수,하지만 난 그 구문의 확실하지 않다.

이러한 메서드가 Object를 사용하는 이유는 무엇입니까? 아니면 역방향 바이트 코드 호환성을위한 디자인 이유가 있습니까? 아니면 또 다른 이유입니까?

+1

이것은 속임수입니다. 그냥 올바른 질문을 찾으려고 ... –

+1

하지만 케빈 B는 그것에 내 참조를 찾기 전에 여기에 대답이있다 :) http://smallwig.blogspot.com/2007/12/why-does-setcontains-take-object -not-e.html –

+1

알 수 있습니다 : http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic (지도에 대한 이야기 목록보다,하지만 그것은 같은 거래). –

답변

1

목록에 추가되거나 목록에서 검색된 유형이 올바른지 확인하십시오. 어쨌든 그것을 수행 할 때 Object.equals() 만 사용할 것이므로 콜렉션에서 찾을 다른 유형의 객체를 제공하면 상관하지 않습니다. 그것은 단순히 그것을 발견하지 못합니다. 이것은 예상되는 행동입니다.

편집 : 의견에 언급 된 Kevin B의 블로그 게시물이 훨씬 더 나은 설명입니다.

+0

"간단히 찾을 수 없습니다"아니요, 다른 유형의 객체가 동일 할 수 있습니다. 그것이 당신이 어떤 종류의 물체도 줄 수있는 진정한 이유입니다. – newacct

1

나는 그래서 당신은 여전히 ​​허용 할 수 있습니다 믿습니다 반드시 지정된 유형의 모든 서브 클래스없는 컬렉션의 서로 다른 유형의 개체 E.

유형 매개 변수는 정말 그 어떤 것도 보장하기 위해 사용된다
0

제네릭의 목적은 사용자가 처리중인 유형을 항상 확인하는 것입니다. 이러한 메소드는 "위험"하지 않으며 콜렉션의 유형에 해를 끼칠 수 없으므로 Java 5에서 이동이 이루어지면 제네릭을 추가 할 필요가 없습니다.

관련 문제