Java:将属性声明为Java给定类型或自编类型(可能带有接口?)

时间:2016-01-12 10:26:15

标签: java types interface

我有一个关于Java的初学者问题。

我有一个类Thing<T>,它有一个属性&#34;属性&#34;。 我希望该属性可以是LinkedList<T>(由Java给出)或自定义类型My_Type<T>,具体取决于赋予Thing构造函数的布尔值。像这样:

public class Thing<T> {
    private ??? attribute;  // Type is not given yet. How do I do this?

    public Thing(boolean which) {
        if (which)
            attribute = new LinkedList<T>();
        else
            attribute = new My_Type<T>();
    }

   ...
}

Thing还有一些使用addremove的方法,这些方法都是针对LinkedListMy_Type实现的。

如何申报我的属性?将其声明为Object不是选项,因为Object不知道方法addremove。我想过使用接口,但我不知道如何。

如果LinkedListMy_Type都由我编写,我可以让他们都实现具有LinkedListOrMy_Type<T>add方法的接口remove。然后,而不是

    private ??? attribute;

我会写

    private LinkedListOrMy_Type<T> attribute;

一切都会好的。但是因为我无法修改LinkedList的代码,所以我不知道如何解决这个问题。有什么建议吗?

使My_Type实现List接口(由Java给出)也不是一种选择,因为我需要在My_Type中实现许多方法。但我只想要addremove。我知道这是一种可能的解决方法 - 我可以让My_Type在列表的每个方法中抛出UnsupportedOperationExceptionaddremove除外。但是我相信如果你给我一个不那么肮脏的建议,我可以学到更多关于优秀编程的知识!

3 个答案:

答案 0 :(得分:1)

走界面路线似乎是个好主意。定义您自己的界面MyInterface并让MyType实现它:

class MyType implements MyInterface

现在就是诀窍: LinkedList不是最终的!通过扩展JDK类并让它实现你的界面来使用OOP:

class MyLinkedList extends LinkedList implements MyInterface

请告诉我们这是否适合你......

答案 1 :(得分:1)

在Java中,不能有一个可以是两种不同类型的字段;你可以做的最接近的是一个常见基类型的字段。所以你有几个选择。

  1. 使用提供addremove的通用基本类型。显而易见的候选人是Collection,由LinkedList实施。

  2. 使用不提供所需方法的公共基本类型,但在需要时强制转换对象。在这种情况下,您可以只使用Object类型的字段,并且每次要使用您的字段时,都必须将其强制转换为任何实际类型。

  3. 使用两个字段。这似乎更有意义 - 拥有两个不同类型的变量并不是变量的工作方式。

  4. LinkedListMyType包含在具有提供所需方法的公共基本类型的类中。

  5. 例如:

    interface WrapperThing<T> {
        void add(T item);
        void remove(T item);
    }
    class ListWrapperThing<T> implements WrapperThing<T> {
        private List<T> list;
        public ListWrapperThing() {
            list = new LinkedList<T>();
        }
        public void add(T item) {
            list.add(item);
        }
        public void remove(T item) {
            list.remove(item);
        }
    }
    class MyTypeWrapperThing<T> implements WrapperThing<T> {
        private MyType<T> my;
        public ListWrapperThing() {
            my = new MyType<T>();
        }
        public void add(T item) {
            my.add(item);
        }
        public void remove(T item) {
            my.remove(item);
        }
    }
    

    然后您可以使用WrapperThing<T>变量,就好像它是一个可以(在其中)包含ListMyType对象的变量。

答案 2 :(得分:0)

好吧,您可以在类型中实现接口List。它由Java中的所有列表实现。当然它提供了比你可能需要的更多的方法,但你可以只实现你需要的方法,例如在其他方法中抛出未实现的异常。