Java Generics:自定义兼容的空/非空列表

时间:2014-07-07 12:22:37

标签: java generics

我有这个任务来制作符合以下要求的自定义通用列表实现:

  • 有3个类:1个抽象类(让' s说ExampleAbstractList),一个空列表实现(例如ExampleEmptyList)和一个非空列表(例如ExampleNonEmptyList
  • 必须能够从两种方式将两个非抽象类添加/连接在一起(例如,将非空列表添加到空列表中,反之亦然)
  • &#34;开发人员&#34;应该使用抽象类(例如ExampleAbstractList<Integer> list2 = new ExampleNonEmptyList<>(11, list1);
  • ExampleNonEmptyList类可以获得2个参数:第一个参数是某种类型,它将是&#34; head&#34;列表,第二个参数应该是一个列表本身(ExampleNonEmptyListExamplenEmptyList
  • 最终,为制造相关对象系列提供工厂功能,以隐藏实际实现

我目前的实现如下:

public abstract class ExampleAbstractList<T> {
    protected transient T head;
    protected transient T tail;
    ...
    public abstract void add(T e);
    ...

}

public final class ExampleNonEmptyList<T, U> extends ExampleAbstractList<T> {
    protected ArrayList<T> tail_elements = new ArrayList<>();
    public ExampleNonEmptyList(T head, U tail)
    {
        this.setHead(head);
        this.add((T) tail);
    }

    ...
    @Override
    public void add(T e)
    {
        if(e instanceof ExampleNonEmptyList)
        {
            ExampleNonEmptyList enel = (ExampleNonEmptyList) e;
            T enHead = (T) enel.getHead();
            this.getTailElements().add(enHead);

            for(Object tElem : enel.getTailElements())
            {
                T tailElement = (T) tElem;

                this.getTailElements().add(tailElement);
            }
        } else if (e instanceof ExampleEmptyList) {
            ExampleEmptyList list = (ExampleEmptyList) e;
            if(list.size() == 0)
                return;

            for(Object el : list.getList())
            {
                this.getTailElements().add((T) el);
            }
        } else {
            this.getTailElements().add(e);
        }

        this.updateSize();
    }

    ...
}

public final class ExampleEmptyList<T> extends ExampleAbstractList<T> {

    private final List<T> list = new ArrayList<>();
    ...
    public void add(T e)
    {
        this.getList().add(e);
        this.updateSize();
    }
    ...
}

现在,问题是我无法将ExampleNonEmptyList添加到ExampleEmptyList,因为我收到以下错误:

incompatible types: ExampleAbstractList <Integer> cannot be converted to Integer(当我尝试添加整数列表时)

例外:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: ExampleAbstractList.add
    at Main.main(Main.java:42)
Java Result: 1

Main.java中的代码:

32    ExampleAbstractList<Integer> list0   = new ExampleEmptyList<>(); 
33          list0.add(3);
34          ExampleAbstractList <Integer> list1   = new ExampleNonEmptyList<>(1, list0);
35          ExampleAbstractList <Integer> list2   = new ExampleNonEmptyList<>(32, list1);
36          list2.add(9);
...
Some prints
...          
42         list0.add(list1);

我理解错误,我确信它与类型参数有关,但我无法弄清楚如何解决这个问题......有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

从您的代码中可以看出,您使用list0.add(list1)向另一个列表添加了一个列表。请改用list0.addAll(list1)方法。 addAll方法将Collection<? extends E> c作为参数,应该在您的特定情况下使用。更多信息here