2012-04-27 3 views
0

Set<E>의 메소드 선언을 보자.컴파일시 일반 유형 검사

public boolean add(E e); 
public E get(int index); 

그리고 이것을 사용해 보겠습니다.

List<Boolean> list = new ArrayList<Boolean>(); 
Integer i = list.get(0);    //Predictably, here we get a compile error. 
list.contains(new Integer(3));  //But this line is allowed. Why? 

이 코드의 비상용 (내가 아는 바대로 간단하게 변환 됨)에서도 두 줄 모두에서 컴파일 오류가 발생합니다.

List s = new ArrayList(); 
s.contains((Boolean)(new Integer(3))); 
Integer i = (Boolean)s.get(3); 

그럼 일반적인 경우에 오류가 발생하지 않습니까?

답변

3

this question에 대한 답변보기

기본적 contains()remove()는 등의 방법은 개체들이 동일한 타입이없는 것을 동일을 비교하고 제거되지 않도록주의.

1

음,이 라인 :

s.contains((Boolean)(new Integer(3))); 

당신이 무엇을 캐스팅 할 수 있기 때문에 단순히 컴파일시 오류가있다 부울에 대한 Integer 인스턴스. List의 제네릭과는 아무런 관련이 없습니다.

그런 다음 contains(Object o)은 일반적으로 (java.util.Collection 내에서) 입력되지 않으므로 컴파일 타임 경고가 표시되지 않습니다. 이것은 공분산과 반 차별과 관련이 있습니다. 목록 인터페이스 API에서

1

:

E get(int index) 

는 그래서 제네릭 형식의 개체를 반환합니다. contains하는 동안 PARAM로 Object을 가져옵니다

boolean contains(Object o) 

은 그래서 모든 메소드 서명에 관하여이다. 더보기 List