假设我们有以下接口:在Java中,如何区分实现相同接口的类?
interface Addable {
Addable add (Addable element);
}
现在我要宣布两班,说MyList
和实现上述接口。我怎样才能做到这一点,但防止对象被添加到MyList
,反之亦然?
有没有办法做到这一点没有if
陈述和instanceof
?
假设我们有以下接口:在Java中,如何区分实现相同接口的类?
interface Addable {
Addable add (Addable element);
}
现在我要宣布两班,说MyList
和实现上述接口。我怎样才能做到这一点,但防止对象被添加到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);
}
下面引用的wikipedia entry解释了为什么这个工程:
泛型泛型编程的设施,被添加到 的Java编程语言在2004年作为J2SE 5.0的一部分。它们允许“ 类型或方法在各种类型的对象上操作,同时提供编译时类型安全性。” 1这个特性的一个常见用法是当 使用一个可以容纳任何类型对象的Java集合来指定 存储在其中的特定类型的对象。
你能解释为什么这会起作用吗? –
@SoboLAN - 您需要转到Java教程并阅读泛型类型部分。这将有助于你理解它为什么有效。 –
@StephenC我知道它为什么有效。我的意思是其他人可能会读这个解释。毕竟,这是一个非常公共的地方... –
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;
}
}
+1请注意,'SillyList类实现Addable
你真的需要了解Java泛型。
问:你如何防止这个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 ,或者相反。
为什么你想不做'if'和'instanceof'? – Philipp
如果实现不可交换,请勿使用通用接口! – Adam
@codesparkle:最好的建议! – Tudor