实现基于Arraylist的Bag / Multiset-卡在泛型上

时间:2011-11-15 21:27:38

标签: java generics data-structures

一项任务要求我们使用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之间存在类型不匹配。

两个问题:

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

1 个答案:

答案 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);
  }
}