2011-10-26 1 views
5

를 동작하는 예제입니다 : 무제한의 와일드 카드를 들어자바 제네릭 : ArrayList를 (무제한의 와일드 카드 타입)에서 추가 오퍼레이션과 addAll 방법이 여기에 직접 되려면 다르게

ArrayList <?> x = new ArrayList(); 
    ArrayList y = new ArrayList(); 
    x.add("abc"); // Clause 1. Compilation error - No problemo. Understood. 
    x.addAll(y); // Clause 2. No compilation error 

, 하나는 추가 할 수 없습니다. 마지막 문장에 컴파일 오류가없는 이유는 무엇입니까?

답변

7

원시 유형으로 메소드를 호출하기 때문에. 컴파일러는 형식 검사를 수행 할 수 없습니다. y 사용자 generics를 만들면 addAll(..)이 실패합니다.

+1

확인. 나는 의미를 본다. 타입은 알려져 있기 때문에 무한대의 와일드 카드가 추가를 막는 일반적인 규칙을 따른다. 2 절은 type 요소가 알려지지 않았기 때문에 레거시 코드와 일반 코드를 혼합하는 일반적인 규칙을 사용합니다. 나는 그것을 올바르게 받았 느냐? – yapkm01

+0

예 - 원시 형식의 경우 모든 제네릭 항목이 삭제됩니다. – Bozho

+0

@ yapkm01 제네릭은 언어에 늦게 추가되어 많은 수의 기존 제네릭 라이브러리와 쉽게 상호 작용할 수 있도록 설계되어야하므로 컴파일러는 원시 형식이있는 경우 제네릭을 무시합니다. – josefx