2012-09-08 72 views
2

假设我们有以下接口:在Java中,如何区分实现相同接口的类?

interface Addable { 
    Addable add (Addable element); 
} 

现在我要宣布两班,说MyList和实现上述接口。我怎样才能做到这一点,但防止对象被添加到MyList,反之亦然?

有没有办法做到这一点没有if陈述和instanceof

+1

为什么你想不做'if'和'instanceof'? – Philipp

+12

如果实现不可交换,请勿使用通用接口! – Adam

+0

@codesparkle:最好的建议! – Tudor

回答

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的一部分。它们允许“ 类型或方法在各种类型的对象上操作,同时提供编译时类型安全性。” 1这个特性的一个常见用法是当 使用一个可以容纳任何类型对象的Java集合来指定 存储在其中的特定类型的对象。

+0

你能解释为什么这会起作用吗? –

+0

@SoboLAN - 您需要转到Java教程并阅读泛型类型部分。这将有助于你理解它为什么有效。 –

+0

@StephenC我知道它为什么有效。我的意思是其他人可能会读这个解释。毕竟,这是一个非常公共的地方... –

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; 
    } 
} 
+0

+1请注意,'SillyList类实现Addable '是可能的。 –

0

你真的需要了解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 ,或者相反。

相关问题