-1

有効: どのオーバーロードを呼び出すかの選択は、コンパイル時に行われます。例:

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));
...

この場合のこの答えは、実際の実行時の型ではなく、常に「コレクション」です。

4

2 に答える 2

0

重要なのは、コンパイラがそれを理解できないということではありません。要点は、オーバーロードはプログラマーを混乱させるため、バグを引き起こす可能性が高いということです。

JLS を呼び出している方法に最も具体的に一致するメソッドを特定するために JLS を引き出す必要がある場合は、そのコードを見たことのあるすべてのメンテナンス プログラマーが同じ作業を行う必要があります。

したがって、オーバーロードには異なる数のパラメーター、または少なくとも相互変換できないパラメーター型を含める必要があるという提案です。

「コンパイル時にオーバーロードを解決する」ことの具体的な危険はこれです。私が持っているとします:

void method(List a) { }
void method(Collection a) { }

次に、これら 2 つの呼び出しは異なることを行います。

List list = new ArrayList();
method(list);
method((Collection)list);

これは、プログラマーにとって非常に直感的ではありません (したがって、混乱を招き、バグの原因となります)。

于 2013-04-06T02:38:14.557 に答える