2

私はJavaでメソッドのオーバーロードを実行していて、Eclipseで以下のプログラムの出力を試していました。プログラムは.です。

public class OverloadingTest {

    public static void main(String args[]){
       List abc = new ArrayList();
       List bcd = new LinkedList();

       ConfusingOverloading co = new ConfusingOverloading();
       co.hasDuplicates(abc); //should call to ArryList overloaded method
       co.hasDuplicates(bcd); //should call to LinkedList overloaded method
    }


}

class ConfusingOverloading{

    public boolean hasDuplicates (List collection){
        System.out.println("overloaded method with Type List ");
        return true;
    }

    public boolean hasDuplicates (ArrayList collection){
        System.out.println("overloaded method with Type ArrayList ");
        return true;
    }


    public boolean hasDuplicates (LinkedList collection){
        System.out.println("overloaded method with Type LinkedList ");
        return true;
    }

}

そして出力は..

Output
overloaded method with Type List
overloaded method with Type List

説明では、メソッドのオーバーロードはコンパイル時にJavaの静的バインディングを使用して解決されると言われているので、メソッドのオーバーライドによって同じことを実現する方法を教えてください。

4

2 に答える 2

1

abcbcd両方とも . でList初期化した場合でもタイプであるsubclassため、結果は

BaseClass likeは、そのサブクラス ( ArrayList または LinkedListList )のいずれかで動作するメソッドを作成するのに役立ちます。そう、

public ArrayListLinkedListCanCallMe(List lst)
{
 //now imagine if this method was called with bcd as parameter
 //still lst would be of type List not LinkedList
 //and if lst were allowed to be of type LinkedList then how could List know any
 //of the methods of LinkedList.Therefore lst would always be of type List NOT LinkedList
}

代わりに試すことができます

co.hasDuplicates((ArrayList)abc);
co.hasDuplicates((LinkedList)bcd);

ただし(ArrayList)abc、 abc がタイプの場合はキャスト例外をスローLinkedListできます。instanceof演算子を使用して、 abc がタイプであるかどうかを確認してArrayListからキャストできます..

于 2013-02-10T17:26:41.037 に答える
0

この特定のケースでは、hasDuplicates が意味することを意味する場合、List を引数として取る 1 つのメソッドがあります。リストの内容で初期化された HashSet を作成し、そのサイズをリストのサイズと比較するだけです。

ArrayList などの特別なケースのコードが本当に必要な場合は、 List 引数メソッド内で instanceof を使用できます。

ただし、インターフェイス タイプを使用する場合は、インターフェイスのすべての実装で機能する共通のアプローチを見つける方がはるかに優れています。それができない場合は、インターフェイスを実装するクラスのオブジェクトが渡される可能性を考慮に入れる必要がありますが、そのクラスは特別なケースのコードを持つクラスの 1 つではありません。java.util.ArrayList の特別なケースのコードが必要な場合、Arrays.asList がその結果に使用するプライベート クラスのインスタンスの特別なケースのコードが必要ないのはなぜですか?

問題が独自のコード内の異なるクラスである場合、多くの場合、問題を好転させ、現在の引数クラスにメソッドを配置して、従来のオーバーライドが機能するようにすることができます。

于 2013-02-10T17:33:43.753 に答える