2017-04-18 6 views
0

제네릭에서 유형 삭제의 개념을 읽었습니다. 아래 코드를 실행하는 동안 나는 혼란스러워했다. 유형의 삭제 개념으로 당 제네릭 혼동으로 지우기 형식

public class CollectionsWild { 
    void Test(Collection<?> t){ 
     System.out.println("Collection"); 
    } 

    void Test(List<Integer> t){ 
     System.out.println("List"); 
    } 


    public static void main(String[] args) { 
     CollectionsWild o = new CollectionsWild(); 
     o.Test(new ArrayList<String>()); 
    } 

} 

" List<Integer> t는"바이트 코드에서 "목록 t"로 변환됩니다. 그렇다면 Collection을 매개 변수로 사용하는 메서드 테스트가 호출되는 이유는 무엇입니까? List로 매개 변수로 메서드를 호출해야합니다.

+0

감사합니다.하지만 보내 주신 링크는 내가 묻고있는 것과 관련이 없습니다. –

답변

2

이것은 삭제와는 아무 관련이 없습니다. 과부하 해결은 컴파일 타임에 완료됩니다. 하나의 과부하가 ArrayList<String>과 일치하며 그 중 하나만 선택됩니다. 일치하는 항목이 2 개 이상있는 경우 가장 구체적인 항목이 선택됩니다.

동일한 유형의 삭제로 오버로드되는 경우 과부하 해결을 고려하기 전에 유형 정의가 컴파일되지 않습니다.

2

메소드 선택은 컴파일 타임입니다. 형식 소거가 발생한 후 . 당신이 JLS§15.12.2에서 볼 수 있듯이, 일반적인 유형은 고려 매개 변수 :

이 방법을 적용 할 뜻이, 일반적인 방법 (§8.4.4)의 경우, 인 형의 인수의 분석이 필요한지 여부를 결정.