2011-12-30 5 views
2

나는 SCJP/OCPJP에 대해 공부하고 있으며, 나는 이음새가 내게 이상하다는 샘플 질문을 발견했다. 질문에일반적인 유형의 클래스 인스턴스화 <?>

List<?> list = new ArrayList<?>(); 
List<? extends Object> list2 = new ArrayList<? extends Object>(); 

은 "올바른"답이 코드는 컴파일 것이다 그러나 두 컬렉션에 추가하는 런타임 오류가 발생 것이라고했다 :

는 샘플 코드는 두 개의 일반적인 컬렉션을 인스턴스화.

이와 같은 코드를 컴파일하려고하면 오류가 발생합니다. 자바 튜토리얼에서는 이러한 유형의 코드조차 보여주지 않고 대개 와일드 카드를 업 캐스팅의 일부로 사용합니다.

Collection<?> c = new ArrayList<String>(); 

도 합법적 인 코드 위의 두 제네릭 컬렉션 있습니까? 내 논리에 의한 두 번째 것은 인터페이스 만 허용하지 않습니다. 첫 번째는 완전히 쓸모없는 것처럼 보입니다. 제어를 시도하지 않는 제네릭을 사용해야하는 이유는 무엇입니까?

+0

이것이 어떻게 컴파일되는지는 모르겠지만 두 컬렉션에 모두 잘 추가 할 수 있습니다. 단 하나의 객체 만 추가하면됩니다. 어떤 개체가 모든 클래스에 유효한지 알아내는 독자를위한 연습으로 남겨 둡니다 :) – Voo

+0

당신도 할 수 없습니다. 샘플 질문/답변이 잘못되어 있고 분명히 그렇습니까? – jeremyjjbrown

+0

다운이 지금 어떤 이유로 투표를 했습니까? – jeremyjjbrown

답변

4

체크 아웃 우수한 Java generics tutorial PDF : 컴파일 및 실행,하지만 당신은 할 수없는 것

List<?> list = new ArrayList(); 

. 구체적으로 와일드 카드에 대한 부분은 귀하의 질문에 대한 답을 포함하고, 우리가 c 스탠드의 요소 유형은, 우리가 개체를 추가 할 수 있는지 알 수 없기 때문에 나는

Collection<?> c = new ArrayList<String>(); 
c.add(new Object()); 

을 인용. add() 메서드는 E, 컬렉션의 요소 형식 인 형식의 인수를 사용합니다. 실제 유형 매개 변수가 ? 인 경우 알 수없는 유형을 나타냅니다. 추가로 전달하는 매개 변수는 이 알 수없는 유형의 하위 유형이어야합니다. 타입이 무엇인지 모르기 때문에 아무것도 전달할 수 없습니다. 유일한 예외는 모든 타입의 멤버 인 null, 입니다. 당신은 런타임에 유형을 선언하려면

+0

그 문서는 실제로 매우 유용합니다. 고맙습니다! 반성 또는 내부 수업에 능숙한 기사를 알고 있습니까? – jeremyjjbrown

1

다소 대답하기 전에 this 답에 답변했습니다. ?은 인스턴스화에 사용할 수 없습니다. 나는 왜 코드가 컴파일 될 것이라고 말을하는지 모르겠다. 내가 사용했던 자바 컴파일러는 아무 것도 허용하지 않을 것이다. 다음과 같은 이상 표시됩니다 일을 할 수 있습니다 :

list.add("hello world"); //This wouldn't compile 
2

, 당신은 같은 것을 할 수 있습니다

public class Clazz1<T> { 

private final List<T> list = new ArrayList<T>(); 

private List<T> getList() { 
    return list; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    Clazz1<Integer> clazzInt = new Clazz1<Integer>(); 
    clazzInt.getList().add(2); 
    System.out.println(clazzInt.getList()); 

    Clazz1<String> clazzString = new Clazz1<String>(); 
    clazzString.getList().add("test"); 
    System.out.println(clazzString.getList()); 
} 

} 
0

new는 객체의 구체적인 인스턴스를 생성합니다. 구체적인 인스턴스에는 제네릭을 포함하여 하나의 유형 만있을 수 있습니다. 이것을 알면 와일드 카드는 new과 함께 작동하지 않습니다.

관련 문제