一项任务要求我们使用ArrayList或LinkedList作为后端来实现Bag数据类型。我选择了ArrayList并创建了我自己的实现,包括Collection接口的本地实现。现在我正在努力解决如何使用我的List类调整Bag的属性的基本概念,特别是在List中插入List。
我的List的设置方式遵循通常的Java类型,除了没有实现所有方法,这就是为什么我将自己的Collection接口类型编写为
public interface Collection<E>
实现添加,删除,大小,清除,包含,isEmpty和toArray方法。
List类型声明为
public class List<E> implements Collection<E>
有三个私人字段:
private int size;
private E[] data;
private int growSize=10;
E[] data
包含所需的任何元素类型,growSize是根据需要增加列表大小的新插槽数。当List传统上用于单个对象时,这很有用,但是当我尝试插入List类型时出现错误。
我正在尝试实施此方法:
public boolean add(Collection<E> c){
if (size < data.length){
data= (E[]) new Object[10];
data[0]= c;
}
}
当我尝试这个时,它表示Collection和E之间存在类型不匹配。
两个问题:
答案 0 :(得分:3)
您不能将参数化类型用于两种不同的类型。在您的情况下(如果我找到您),您尝试对E
类型本身使用参数化类型E
并键入Collection<E>
。
如果您尝试在List<E>
中使用这两种不同的类型,那么您实际上在Generics中没有用。你可以在没有它的情况下声明你的List(以及超类型Collection)。
如果您尝试接受E类型的对象列表,并将其中的每一个逐个添加到List<E>
,那么E
类型的每个此类对象都将成为列表中的元素,然后您应该将实现更改为:
public boolean addAll(Collection<E> c) {
for( E e : c ) {
this.add(e);
}
}