Java泛型:自定义兼容的空/非空列表
我的任务是制定符合以下要求的自定义通用列表实现: 有3个类:1个抽象类,比如说ExampleAbstractList,一个空列表实现(例如ExampleEmptyList)和一个非空列表(例如ExampleNoneEmptyList) 必须能够通过两种方式将两个非抽象类添加/合并在一起,例如,将非空列表添加到空列表中,反之亦然 开发人员应该使用抽象类,例如ExampleAstractList list2=new ExampleNonemptyList 11,list1; ExampleNonEmptyList类可以获得2个参数:第一个参数是某种类型的,它是列表的头,第二个参数应该是列表本身ExampleNonEmptyList或ExamplenEmptyList 最终,为制造相关对象族提供工厂功能,以隐藏实际实现 我当前的实现如下所示:Java泛型:自定义兼容的空/非空列表,java,generics,Java,Generics,我的任务是制定符合以下要求的自定义通用列表实现: 有3个类:1个抽象类,比如说ExampleAbstractList,一个空列表实现(例如ExampleEmptyList)和一个非空列表(例如ExampleNoneEmptyList) 必须能够通过两种方式将两个非抽象类添加/合并在一起,例如,将非空列表添加到空列表中,反之亦然 开发人员应该使用抽象类,例如ExampleAstractList list2=new ExampleNonemptyList 11,list1; ExampleNonEm
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();
}
...
}
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);
我理解这个错误,我确信它与类型参数有关,但我不知道如何修复这个错误。。。谁能帮帮我吗
谢谢 从代码中可以看出,您正在使用list0.addlist1将一个列表添加到另一个列表。请改为尝试list0.addAlllist1方法。addAll方法接受CollectionYou可以发布完整的错误吗?为什么ExampleNonEmptyList有两个类型参数而不是一个?您最终只能将U tail强制转换为类型T,如果它们是同一基础列表中的元素,它们应该是同一类型。@Tenner当我这样做时,我是这样做的,因为类必须接收两个不同类型的参数,但现在我看到我可以在那里引用ExampleAxtractList而不是“U”。我现在已经解决了这个问题,但这并不能解决我的问题。我这样做了:“public void addallcollection您只需要将list0.addlist1替换为list0.addAlllist1。这就是你所做的吗?是的,甚至将列表1铸造到CollectionOk。但是list0.addlist1肯定是不正确的。我们必须深入挖掘。
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);