2016-06-07 3 views
0

오버로드 된 메서드를 사용하여 다음 클래스를 고려하십시오.컬렉션 형식으로 메서드 오버로드가 예상대로 작동하지 않습니다.

public final class TeaParty { 
    private void travellerListed(Collection o) { 
    System.out.println("travellerListed(Collection<?>)"); 
    } 
    private void travellerListed(List s) { 
    System.out.println("travellerListed(List<Number>)"); 
    } 
    private void travellerListed(ArrayList i) { 
    System.out.println("travellerListed(ArrayList<Integer>)"); 
    } 

    private void method(List t) { 
    travellerListed(t) ; 
    } 

    public static void main(String[] args) { 
     TeaParty test = new TeaParty(); 
     test.method(new ArrayList()); 
    } 
} 

출력으로 "travellerListed (ArrayList)"가 필요합니다. 하지만 나는 "travellerListed (Collection)"을 얻는다. 예기치 않은 과부하의 원인은 무엇입니까? 당신이 컴파일 -에 의해 결정되는 방법 과부하를 해결하기 때문에, 컴파일러는 private void travellerListed(List s) 선택 travellerListed에 호출 있도록 ArrayList 그 인수 입력 한 List입니다 method에 전달되기 때문에

+0

용어에 대한 힌트 : "generic"유형이 아닙니다 ("generics"관점에서 볼 때 실제로 여기에 ** raw ** 유형을 사용하고 있으며 ... 처음부터 사용해서는 안됨). 따라서 이것은 오버로딩과 컴파일러가 선택하는 버전에 관한 것입니다. 그리고 좀 더 면밀히 살펴보면 ... 네가 과부하가 걸린다는 것을 알 수 있습니다. 하지만 당신은 ** 절대 ** 여기에 오버로드 된 메서드를 호출합니다! – GhostCat

+1

제네릭 형식 (귀하의 질문과 관련이 없음) : 일반 형식은 컴파일하는 동안에만 사용됩니다. 런타임시 제네릭 타입은 사용할 수 없습니다 (타입 지우개). 그래서'void travellerListed (List value)'와'void travellerListed (List value)'void는 런타임에 동일하기 때문에 가질 수 없습니다. –

답변

3

사실이 코드는 당신이 "travellerListed(List<Number>)"에 결과를 게시 (private void travellerListed(ArrayList i)을 선택할 수 없음을 의미) 및 ListCollection (보다 자세한 유형은 private void travellerListed(Collection o)이 선택되지 않음)입니다.

관련 문제