3

次のインターフェースがあるとします。

interface Addable {
    Addable add (Addable element);
}

ここで、上記のインターフェイスを実装するMyListとという2 つのクラスを宣言したいと思います。MyArrayどうすればこれを行うことができMyArrayますMyListか?

ifステートメントなしでこれを行う方法はありinstanceofますか?

4

3 に答える 3

4

インターフェイス定義を次のように変更してはどうでしょうか。

    interface Addable<T extends Addable.Element> {
        interface Element { }

        Element add(T element); // OR T add(T element);
    }

    class MyList implements Addable<MyList.MyListElement> {

        static class MyListElement implements Addable.Element { }

        @Override
        public Element add(MyListElement element) {
            return null;
        }
    }


    class MyArray implements Addable<MyArray.MyArrayElement> {
        static class MyArrayElement implements Addable.Element { }

        @Override
        public Element add(MyArrayElement element) {
            return null;
        }
    }


    public static void main(String[] arg) {
        MyArray myArray = new MyArray();
        MyArrayElement a = new MyArrayElement();
        myArray.add(a);

        MyList myList = new MyList();
        MyListElement l = new MyListElement();
        myList.add(l);

        //try to add a MyArrayElement to a MyList
        // Error The method add(MyListElement) in the type MyList
        // is not applicable for the arguments (MyArrayElement)
        myList.add(e);

        //try to add a MyListElement to a MyArray
        // Error The method add(MyArrayElement) in the type MyArray
        // is not applicable for the arguments (MyListElement)
        myArray.add(l);
    }

以下に引用されているウィキペディアのエントリは、これが機能する理由を説明しています。

ジェネリックは、J2SE 5.0 の一部として 2004 年に Java プログラミング言語に追加されたジェネリック プログラミングの機能です。それらは、「コンパイル時の型の安全性を提供しながら、型またはメソッドがさまざまな型のオブジェクトを操作できるようにする」ことを可能にします。1この機能の一般的な用途は、任意のタイプのオブジェクトを保持できる Java コレクションを使用して、そこに格納されているオブジェクトの特定のタイプを指定することです。

于 2012-09-08T14:50:56.340 に答える
4
interface Addable<T extends Addable<T>> {
    T add (T element);
}

class MyList  implements Addable<MyList> {
    public MyList add(MyList element) {
        return null;
    }
}

class MyArray   implements Addable<MyArray> {
    public MyArray add(MyArray element) {
        return null;
    }
}
于 2012-09-08T14:54:23.220 に答える
0

Java Genericsについて本当に学ぶ必要があります。

Q: Java でこれを防ぐにはどうすればよいですArrayListか?

A: ArrayList<MyArray>vs.を使用しArrayList<MyList>ます。

それはあなたがここに持っていたいものと同じです:

interface Addable<T> {
    T add (T element);
}

そして、クラスに and を実装さAddable<MyList>Addable<MyArray>ます。

MyList の場合、メソッドを実装する必要があります

MyList add(MyList element);

一方、MyArray の場合は次のようになります。

MyArray add(MyArray element);

ご覧のとおり、MyList を MyArray に追加したり、その逆はできません。

于 2012-09-08T15:04:07.753 に答える