考虑以下带有重载方法的类。
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(集合)”。 是什么原因导致这种意外的重载?
最佳答案
实际上,您发布的代码结果为 "travellerListed(List<Number>)"
,因为您正在传递 ArrayList
至method
,其参数类型为 List
,因此调用 travellerListed
编译器选择private void travellerListed( List s)
,因为方法重载解析是由参数的编译时类型决定的(这意味着不能选择private void travellerListed( ArrayList i)
),并且List
是比 Collection
更具体的类型(这解释了为什么不选择private void travellerListed( Collection o)
)。
关于java - 使用集合类型重载的方法无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37677240/