오버로드 된 메서드를 사용하여 다음 클래스를 고려하십시오.컬렉션 형식으로 메서드 오버로드가 예상대로 작동하지 않습니다.
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
에 전달되기 때문에
용어에 대한 힌트 : "generic"유형이 아닙니다 ("generics"관점에서 볼 때 실제로 여기에 ** raw ** 유형을 사용하고 있으며 ... 처음부터 사용해서는 안됨). 따라서 이것은 오버로딩과 컴파일러가 선택하는 버전에 관한 것입니다. 그리고 좀 더 면밀히 살펴보면 ... 네가 과부하가 걸린다는 것을 알 수 있습니다. 하지만 당신은 ** 절대 ** 여기에 오버로드 된 메서드를 호출합니다! – GhostCat
제네릭 형식 (귀하의 질문과 관련이 없음) : 일반 형식은 컴파일하는 동안에만 사용됩니다. 런타임시 제네릭 타입은 사용할 수 없습니다 (타입 지우개). 그래서'void travellerListed (List value)'와'void travellerListed (List value)'void는 런타임에 동일하기 때문에 가질 수 없습니다. –