【问题标题】:Implementing a Arraylist-based Bag/Multiset- stuck on generics实现基于 Arraylist 的 Bag/Multiset - 停留在泛型上
【发布时间】:2011-11-15 21:27:37
【问题描述】:

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

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

public interface Collection<E>

实现 add、remove、size、clear、contains、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 泛型的哪些规则,为什么?
  • 其次,需要什么来修复它?

【问题讨论】:

  • 请提供有关您的错误和导致错误的代码的更多信息
  • E 可以是 List> 类型。你遇到了什么错误?
  • add 是做什么的?添加单个元素?还是添加某个集合中的所有元素?

标签: java generics data-structures


【解决方案1】:

您不能将参数化类型用于两种不同的类型。在您的情况下(如果我明白了),您正在尝试将参数化类型 E 用于类型 E 本身和类型 Collection&lt;E&gt;

如果您试图在List&lt;E&gt; 中包含这两种不同的类型,那么在泛型中实际上没有用处。你可以在没有它的情况下声明你的 List(和超类型 Collection)。

如果您尝试接受类型 E 的对象列表,并将它们中的每一个一个接一个添加到您的 List&lt;E&gt;,这样每个 E 类型的对象都将成为您的元素列表,那么您应该将实现更改为:

public boolean addAll(Collection<E> c) { 
  for( E e : c ) {
     this.add(e);
  }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2014-03-25
    • 2012-02-10
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多