我有这个任务来制作符合以下要求的自定义通用列表实现:
ExampleAbstractList
),一个空列表实现(例如ExampleEmptyList
)和一个非空列表(例如ExampleNonEmptyList
) ExampleAbstractList<Integer> list2 = new ExampleNonEmptyList<>(11, list1);
ExampleNonEmptyList
类可以获得2个参数:第一个参数是某种类型,它将是&#34; head&#34;列表,第二个参数应该是一个列表本身(ExampleNonEmptyList
或ExamplenEmptyList
)我目前的实现如下:
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);
我理解错误,我确信它与类型参数有关,但我无法弄清楚如何解决这个问题......有人可以帮助我吗?
谢谢!
答案 0 :(得分:0)
从您的代码中可以看出,您使用list0.add(list1)
向另一个列表添加了一个列表。请改用list0.addAll(list1)
方法。 addAll方法将Collection<? extends E> c
作为参数,应该在您的特定情况下使用。更多信息here