2013-12-14 2 views
1

다음 코드간에 차이가 있습니까?Java Generics : <E> 목록과 <?> 목록간에 차이가 있습니까?

public static <E> void printElements(List<E> list) { 
    for (E elem : list) { 
     System.out.println(elem); 
    } 
} 

public static void printElements(List<?> list) { 
    for (Object elem : list) { 
     System.out.println(elem); 
    } 
} 

예라면, 사람이 차이를 설명 할 때 무엇을 사용할 수 있나요?

+2

이것은 여러 번 묻습니다 ... 왜 사이트를 검색하지 않습니까? – SJuan76

+1

'list.add'를 실행 해보면 차이점을 알 수 있습니다. –

+0

공정하게 말하면, "중복"도 실제로는 하나도 아닙니다. OP는 그 질문보다 미묘한 차이점에 대해 질문하고 있습니다. –

답변

0

비록 직관적이지는 않지만 차이가 있습니다. 자세한 내용은 the java standard tutorial을 읽어 보시기 바랍니다.

기본적으로 두 개는 서로 다른 호환되지 않는 유형입니다. List<E>은 확장, 서브 클래스 또는 실제로 유형이 E 인 객체를 저장할 수 있지만 그 자체의 유형입니다. List<Object>String을 추가 할 수 있더라도 을 List<Object> 참조에서 참조 할 수 없습니다.

List<?>은 매개 변수화 된 참조를 참조 할 수있는 목록 참조임을 의미합니다. List<?>List<String> 또는 List<Integer>을 나타낼 수 있습니다. 그것은 어떤 인터페이스 나 클래스에 묶여있을 때 가장 유용합니다. 예를 들어, 아래의 첫 번째 메소드 (자바 표준 튜토리얼에서 수정)는 List<Number> 일 뿐이며 List<Double> 또는 List<Integer>과 같은 것은 아닙니다.

public static double sumOfList(List<Number> list) { 
    double s = 0.0; 
    for (Number n : list) 
     s += n.doubleValue(); 
    return s; 
} 

그러나 와일드 카드를 사용하여 다음 코드는 List<Double> 또는 List<Integer> 수 있습니다. 더 유연합니다.

public static double sumOfList(List<? extends Number> list) { 
    double s = 0.0; 
    for (Number n : list) 
     s += n.doubleValue(); 
    return s; 
} 
+0

그러나 ' double sumOfList (List list)'는 OP가 요구하는 것입니다. 어떤 유형의 매개 변수로도 목록을 가져옵니다. –

+0

하지만 형식이 안전하지 않습니다. List 이라고 말하면 목록 을 전달할 수 있으며 메소드가 수행하는 것을 기반으로 런타임 예외가 발생할 수 있습니다. 그러나 List 는 매개 변수가있는 형식이 메서드가 사용할 수있는 형식인지 확인합니다. – rapidclock

0

첫 번째 문은 Bounded Type ParamaterE이고 두 번째 문은 Wildcard Parameter입니다. 첫 번째 문은 "매개 변수가있는 형식의 형식 인수로 사용할 수있는 형식을 제한"하므로 제한적입니다. 귀하의 경우 ?은 일부 유형의 목록이라고 말하지만 그것이 무엇인지는 알 수 없습니다. 그것은 무제한 타입입니다.

+2

두 경우 모두 똑같습니다. 'E'에 대한 경계도 없습니다. –

+0

예를 들어, 예. 'E'는 paramaterized 타입으로 묶여 있으므로 컴파일 타임 검사에만 도움이됩니다. '? '를 타입에 경계하는 방법은 없습니다. –

+1

"바인딩"으로 "경계"를 혼동하고 있다고 생각합니다. –

관련 문제