假设我们有以下界面:
interface Addable {
Addable add (Addable element);
}
现在我要声明两个实现上述接口的类MyList
和MyArray
。如何执行此操作,但阻止将MyArray
对象添加到MyList
,反之亦然?
有没有办法在没有if
语句和instanceof
的情况下执行此操作?
答案 0 :(得分: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);
}
下面引用的wikipedia entry解释了为什么会这样做:
泛型是添加到的泛型编程工具 Java编程语言在2004年作为J2SE 5.0的一部分。他们允许“a 提供时对各种类型的物体进行操作的类型或方法 编译时类型安全。“1此功能的一个常见用途是 使用可以保存任何类型对象的Java Collection来指定 存储在其中的特定对象类型。
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
您真的需要了解 Java Generics 。
问:如何阻止Java ArrayList
?
答:使用ArrayList<MyArray>
与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,反之亦然。