我有一个包含这四种方法的B类:
public class B {
public void f(int x) {
System.out.println("1");
}
public void f(Object x) {
System.out.println("2");
}
public void f(List x) {
System.out.println("3");
}
public void f(Collection x){
System.out.println("4");
}
在主要内容中我有这些命令:
B o = new B();
Integer n = new Integer(3);
List<Integer> l = new ArrayList<>();
Collection<Integer> m = new ArrayList<>();
o.f(3);
o.f(n);
o.f(l);
o.f(m);
结果将是:
1
2
3
4个
为什么“3”被认为是int而Integer(3)被称为Object? 为什么列表或集合不被视为对象?
答案 0 :(得分:5)
它在编译时选择了最具体的方法版本。
Object
被视为Object
,因为 是Object
(它继承自Collection
):
https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
如果您没有更具体的方法版本, List
和Object
也会被视为Collection
。
但是,由于您还重载了List
和{{1}}的方法,因此会使用这些方法。
答案 1 :(得分:0)
这里有两个问题,我只看一下List,Collection,Object,因为Integer int在别处被回答。
使用最指定的方法。
所以List继承自Collection,它们都是Object。这使List更具体,因此当您传递List时,它会选择将List作为参数的方法。即使列表可以传递给Object或Collection方法。你可以通过演员表达到同样的效果。
Code Counts1 Counts2 TotalCounts
1 10 20 30
4 15 18 33
5 5 14 19
... ... ... ...
将导致2。