有效:在编译时选择调用哪个重载。例子:
class parentsecond{
public int getdouble(int x){ return x*2;}
}
class second extends parentsecond{
public int getdouble(int x){ return x*3;}
}
class third{
public static void calloverload(parentsecond s){
System.out.println(s.getdouble(4));
}
public static void calloverload(second s){
System.out.println(s.getdouble(4));
}
public static void main(String[] args){
third t=new third();
parentsecond s=new second();
t.calloverload(s);
}
}
答案是 12。实例方法重载方法的行为也是相同的。
因此,在任何一种情况下,调用哪个重载方法的决定都是在运行时而不是编译时做出的(它总是被调用的“第二个”getdouble)。
所以在“Effective Java”中这个特定项目有一些我没有得到的资格。
请帮助澄清“在编译时解决重载”的含义。
以上与此有何不同:
....
class fourth{
public static String getCollection(Set<?> s){
return "Set";
}
public static String getCollection(Collection<?> c){
return "Collection";
}
public String getiCollection(Set<?> s){
return "Set";
}
public String getiCollection(Collection<?> c){
return "Collection";
}
public static void main(String[] args){
Collection<String> c=new HashSet<String>();
System.out.println(fourth.getCollection(c));
fourth f=new fourth();
System.out.println(f.getiCollection(c));
...
在这种情况下,此答案始终是“集合”而不是实际的运行时类型。