2013-04-27 1 views
4

의 매개 변수 유형은 아래의 코드는 컴파일 타임 오류가 발생제네릭과 자바

메소드 추가 ( 목록은 인수가 적용되지 않습니다 유형에 문자열)

코드 :

List<? extends Object> a1 = new ArrayList(); 
a1.add("string"); 

오류 라인에 있습니다 :

a1.add("string"); 

클래스 문자열이 객체에서 확장 된 이유 ref1이 String 유형을 허용하지 않는 이유는 무엇입니까?

답변

4

이 글, http://java.dzone.com/articles/covariance-and-contravariance을 읽어 보시기 바랍니다 사용할 수있는이 문제를 제거합니다. 우리는 단지 구조에서 일반 값을하고자 할 때 우리는 공분산 <? extends Object>를 사용, 요약

(기울임 추가는 나의 것이). 우리는 단지 구조로 일반적인 값을 넣어 을하려고 할 때 우리는 <? super Object> contravariance 사용하고 우리는 모두 할 의도 때 우리는 불변 <Object>를 사용합니다.

당신은 당신이 Object o = a1.get(1)을 작성할 수 있습니다 의미 공변 개체 유형을 들고 귀하의 목록을 정의하지만 당신은 a1.add("foo")을 쓸 수 없습니다. 당신이 개체를 추가하지만 그들을 다시 얻을 수 있도록하려면, 당신은 다음과 같은 목록을 정의해야합니다 :

List<? super Object> a1 = new ArrayList<>(); 

그것은 조금 불행, 내 의견으로는, 언어 저자는 조건 extendsuper을 사용되는 공분산 (covariance)과 반 공분 (contravariance)을 나타 내기 위해, 특히 위의 예에서 수퍼 유형이 Object이 아니기 때문에 그렇습니다.

4

? extends Object은 "알 수없는 유형 "을 의미합니다. 컬렉션에 String을 추가하려고하면 컴파일러에서 확인할 수없는 내용이 본질적으로 X = String입니다. 컴파일러가 알고있는 한 XInteger이거나 완전히 다른 것일 수 있습니다.

즉, List<? extends Object>은 "Object을 확장하는 항목이 없음"을 의미하지 않습니다. 간단한 List<Object>을 의미합니다.

1

List<? extends Object>은 모든 유형의 목록과 함께 사용할 수 있습니다. 당신이 생각하는 방법

, 예를 들어

List<? extends Object> a1 = new ArrayList<Integer>(); 
a1.add("string"); 

만 안전 값이 어떤 특정 유형에 속하지 않기 때문에 null 일 것입니다 추가 할 경우이 물건을 추가 할 수 있도록하는 것이 안전 할 것이다.

는 예를 List<String> a1 = new ArrayList<String>() 또는 List a1 = new ArrayList()

관련 문제