这是我遇到困难的作业问题。该课程的骨架如下:
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具有可比性......
答案 0 :(得分:3)
实现排序的唯一集合是SortedMap
和SortedSet
,并且这两个集合都没有绑定类型参数。在内部,我认为它会转换为Comparable<E>
,如果失败则会抛出ClassCastExcepton
。无序集合仅依赖于equals()
和hashCode()
,并且不需要Comparable
。
答案 1 :(得分:3)
你不应该需要compareTo()
因为这会给你一个元素排序的定义(虽然它可以告诉你两个对象是否相等)。除非订单在这里很重要,否则这不是你想要的。
如果不需要订单的假设是正确的,那么您应该依赖的是集合中每个实例的equals(
)方法。
E
正确覆盖equals()
和hashCode()
方法,E
本身将能够确定该元素是否在此集合中。 equals()
方法,那么实例将依赖于Object
的{{1}}实现,它只是比较引用(如果它们都是非空的)。我建议你先确定你对这项任务的要求是否明确。如果需求声明了更具体的内容,您可以确定集合中的相等性。如果您无法获得更明确的信息,我相信您唯一的选择就是依靠equals()
E
的实施。
答案 2 :(得分:0)
您可以绑定类型E
public class Storage<E **extends Comparable**> implements java.util.Collection<E>
您也可以根据需要对Comparable进行参数化。