如何实现实现集合的模板化类

时间:2012-03-07 01:18:56

标签: java collections interface comparable

这是我遇到困难的作业问题。该课程的骨架如下:

public class Storage<E> implements java.util.Collection<E> {
private Object[] data = new Object[256];
private int nextEmptySlot = 0;

@Override
public java.util.Iterator<E> iterator() {
    // returns a class that iterates over the data array
    return new java.util.Iterator() {
        // insert the body of the inner class here
        // 3 methods: remove(), hasNext(), next()
        };
    }
//Override all methods required by the interface
}

现在我遇到的麻烦是编写包含(Object o)等函数,因为模板不会强制E进行比较。如何将模板化类型E视为可比较,以便我可以使用equals和compateTo?我知道有很多方法可以在类声明中进行,但是给出了类声明,并且不要求E具有可比性......

3 个答案:

答案 0 :(得分:3)

实现排序的唯一集合是SortedMapSortedSet,并且这两个集合都没有绑定类型参数。在内部,我认为它会转换为Comparable<E>,如果失败则会抛出ClassCastExcepton。无序集合仅依赖于equals()hashCode(),并且不需要Comparable

答案 1 :(得分:3)

你不应该需要compareTo()因为这会给你一个元素排序的定义(虽然它可以告诉你两个对象是否相等)。除非订单在这里很重要,否则这不是你想要的。

如果不需要订单的假设是正确的,那么您应该依赖的是集合中每个实例的equals()方法。

  1. 如果E正确覆盖equals()hashCode()方法,E本身将能够确定该元素是否在此集合中。
  2. 如果它没有覆盖equals()方法,那么实例将依赖于Object的{​​{1}}实现,它只是比较引用(如果它们都是非空的)。
  3. 我建议你先确定你对这项任务的要求是否明确。如果需求声明了更具体的内容,您可以确定集合中的相等性。如果您无法获得更明确的信息,我相信您唯一的选择就是依靠equals() E的实施。

答案 2 :(得分:0)

您可以绑定类型E

public class Storage<E  **extends Comparable**> implements java.util.Collection<E>

您也可以根据需要对Comparable进行参数化。