Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型:自定义兼容的空/非空列表_Java_Generics - Fatal编程技术网

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

Java泛型:自定义兼容的空/非空列表,java,generics,Java,Generics,我的任务是制定符合以下要求的自定义通用列表实现: 有3个类:1个抽象类,比如说ExampleAbstractList,一个空列表实现(例如ExampleEmptyList)和一个非空列表(例如ExampleNoneEmptyList) 必须能够通过两种方式将两个非抽象类添加/合并在一起,例如,将非空列表添加到空列表中,反之亦然 开发人员应该使用抽象类,例如ExampleAstractList list2=new ExampleNonemptyList 11,list1; ExampleNonEm

我的任务是制定符合以下要求的自定义通用列表实现:

有3个类:1个抽象类,比如说ExampleAbstractList,一个空列表实现(例如ExampleEmptyList)和一个非空列表(例如ExampleNoneEmptyList) 必须能够通过两种方式将两个非抽象类添加/合并在一起,例如,将非空列表添加到空列表中,反之亦然 开发人员应该使用抽象类,例如ExampleAstractList list2=new ExampleNonemptyList 11,list1; ExampleNonEmptyList类可以获得2个参数:第一个参数是某种类型的,它是列表的头,第二个参数应该是列表本身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();
    }
    ...
}
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);