2014-11-20 3 views
1

왜 다음 코드가 컴파일되지 않습니까?와일드 카드 유형 일치 - Java

public static <T> void foo_test(List<? extends T> src, List<T> dest) { 
    for (T o : src) { 
     dest.add(o); 
    } 
} 

public static void main(String [] args) { 
    List<Number> numbers = new ArrayList<Number>(); 
    List<Integer> integers = new ArrayList<Integer>(); 
    foo_test(numbers, integers); 
} 
+0

왜냐하면'Number'는'Integer'를 확장하지 않기 때문입니다. –

답변

5

숫자 목록을 정수 목록에 추가하거나 추가해서는 안됩니다. 숫자는 정수가 아닐 수 있습니다. 그러나 숫자 목록에 정수 목록을 추가 할 수 있으며, 입력 한 내용의 뒤로 이동할 수 있습니다.

foo_test(integers, numbers); 

, T가 코드 Integer로 추정되고 정교하지만, IntegerNumber 확장하지 않기 때문에 호출은 컴파일러 오류입니다 :

이 작동합니다. foo_test(integers, numbers)로 전환

TNumber으로 추론하게, 그리고 컴파일 그래서 IntegerNumber을 확장 않습니다.

1

integersnumbers으로 전환해야합니다. src 목록은 dest보다 구체적인 형식이어야합니다.