有効: どのオーバーロードを呼び出すかの選択は、コンパイル時に行われます。例:
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));
...
この場合のこの答えは、実際の実行時の型ではなく、常に「コレクション」です。