Java 实现基于Arraylist的Bag/Multiset-基于泛型

Java 实现基于Arraylist的Bag/Multiset-基于泛型,java,generics,data-structures,Java,Generics,Data Structures,一项任务要求我们使用ArrayList或LinkedList作为后端实现一个包数据类型。我选择了ArrayList并创建了自己的实现,包括集合接口的本地实现。现在,我正在努力学习如何使用my List类调整包的属性的基本概念,特别是在列表中插入列表 我的列表的设置方式遵循通常的Java类型,只是没有实现所有的方法,这就是为什么我将自己的集合接口类型编写为 public interface Collection<E> E[]data保存所需的任何元素类型,growSize是根据需要增

一项任务要求我们使用ArrayList或LinkedList作为后端实现一个包数据类型。我选择了ArrayList并创建了自己的实现,包括集合接口的本地实现。现在,我正在努力学习如何使用my List类调整包的属性的基本概念,特别是在列表中插入列表

我的列表的设置方式遵循通常的Java类型,只是没有实现所有的方法,这就是为什么我将自己的集合接口类型编写为

public interface Collection<E>
E[]data
保存所需的任何元素类型,growSize是根据需要增加列表大小的新插槽数。当列表传统上用于单个对象时,这非常有效,但是当我尝试插入列表类型时,会出现错误

我正在尝试实现此方法:

public boolean add(Collection<E> c){
  if (size < data.length){
    data= (E[]) new Object[10];
    data[0]= c;
  }
}
公共布尔添加(集合c){
if(尺寸<数据长度){
数据=(E[])新对象[10];
数据[0]=c;
}
}
当我尝试这个方法时,它说Collection和E之间存在类型不匹配

两个问题:

  • 首先,我在这里打破了Java泛型的哪些规则?为什么
  • 第二,需要什么来修复它

不能将参数化类型用于两种不同的类型。在您的情况下(如果我理解您的话),您试图对类型
E
本身和类型
集合使用参数化类型
E

如果您试图在
列表中包含这两种不同的类型,那么实际上在泛型中没有任何用处。您可以只声明列表(和超类型集合),而不声明它

如果您试图接受类型为E的对象列表,并将它们逐一添加到
列表中,以便每个类型为
E
的对象都将成为列表中的一个元素,那么您应该将实现更改为类似以下内容:

public boolean addAll(Collection<E> c) { 
  for( E e : c ) {
     this.add(e);
  }
} 
public boolean addAll(集合c){
对于(E:c){
本条增补(e);
}
} 

请提供有关错误和导致错误的代码的更多信息,请使用列表类型。您遇到了什么错误?添加了什么?添加单个元素?或者添加某个集合中的所有元素?
public boolean add(Collection<E> c){
  if (size < data.length){
    data= (E[]) new Object[10];
    data[0]= c;
  }
}
public boolean addAll(Collection<E> c) { 
  for( E e : c ) {
     this.add(e);
  }
}