考虑以下具有重载方法的类。
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 ());
}
}
我期待&#34; travellerListed(ArrayList)&#34;作为输出。但我得到了&#34; travellerListed(Collection)&#34;。 造成这种意外超载的原因是什么?
答案 0 :(得分:3)
实际上,您发布的代码会生成"travellerListed(List<Number>)"
,因为您将ArrayList
传递给method
,其参数类型为List
,因此调用{ {1}}编译器选择travellerListed
,因为方法重载解析由参数的编译时类型决定(这意味着无法选择private void travellerListed( List s)
),而private void travellerListed( ArrayList i)
是一个比List
更具体的类型(这解释了未选择Collection
的原因)。