考虑以下带有重载方法的类。
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)”。
是什么原因导致这种意外的过载?
最佳答案
实际上,由于您将"travellerListed(List<Number>)"
传递给参数类型为ArrayList
的method
,因此您发布的代码实际上是List
的结果,因此对于travellerListed
的调用,编译器选择private void travellerListed( List s)
,因为方法重载分辨率由参数的编译时类型确定(这意味着不能选择private void travellerListed( ArrayList i)
),而List
是比Collection
更具体的类型(这说明了为什么未选择private void travellerListed( Collection o)
的原因) 。