假设我们有以下界面:
interface Addable {
Addable add (Addable element);
}
现在我想声明两个类,比如说MyList
实现MyArray
上面的接口。我该如何做到这一点,但要防止将MyArray
对象添加到 a 中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);
}
下面引用的维基百科条目解释了为什么这样做:
泛型是一种泛型编程工具,于 2004 年作为 J2SE 5.0 的一部分添加到 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 泛型。
问:对于 Java,您如何防止这种情况发生ArrayList
?
答:通过使用ArrayList<MyArray>
vs. ArrayList<MyList>
。
这与您希望在这里拥有的相同:
interface Addable<T> {
T add (T element);
}
然后让你的类实现Addable<MyList>
和Addable<MyArray>
.
对于 MyList 您必须实现该方法
MyList add(MyList element);
而对于 MyArray 它看起来像这样:
MyArray add(MyArray element);
如您所见,您不能将 MyList 添加到 MyArray,反之亦然。