在Java中,如何区分实现相同接口的类?

时间:2012-09-08 14:39:39

标签: java generics interface

假设我们有以下界面:

interface Addable {
    Addable add (Addable element);
}

现在我要声明两个实现上述接口的类MyListMyArray。如何执行此操作,但阻止将MyArray对象添加到MyList,反之亦然?

有没有办法在没有if语句和instanceof的情况下执行此操作?

3 个答案:

答案 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,反之亦然。