次のインターフェースがあるとします。
interface Addable {
Addable add (Addable element);
}
ここで、上記のインターフェイスを実装するMyList
とという2 つのクラスを宣言したいと思います。MyArray
どうすればこれを行うことができMyArray
ますMyList
か?
if
ステートメントなしでこれを行う方法はありinstanceof
ますか?
インターフェイス定義を次のように変更してはどうでしょうか。
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 コレクションを使用して、そこに格納されているオブジェクトの特定のタイプを指定することです。
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;
}
}
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 に追加したり、その逆はできません。