如何实现只接受 Comparable Objects 的列表 Class

How to implement a List Class that only accepts Comparable Objects

我正在实现一个通用 ArrayList class,它将遵循给定元素的自然顺序。我假设有一些方法可以做到这一点,类似于 TreeSet 如何遵循给定元素的自然顺序。

当我对存储在其中的 objects 使用 .compareTo 方法调用时,出现错误“无法解析 'E' 中的方法 'compareTo'”。我如何告诉编译器 Object E 应该只是实现了可比接口的 classes?

现在,相关代码如下所示:

public class SortedList<E> {
    ...
    public int indexOf(E value) {
        ...
        else if (value.compareTo(this.get(minIndex)) > 1)...
    }
}

这 post 几乎可以提供帮助: 但它针对一种特定的静态方法,而我需要整个 class 的 objects 具有可比性,并且相同的添加似乎不适用于 class header .

有什么我可以添加到执行类似功能的 class header 的吗?

您必须强制要求您的类型参数与其自身具有可比性(因此它具有自然顺序)。您可以通过 bounding the parameter.

public class SortedList<E extends Comparable<E>> {

这样指定。此 bounded 类型允许比较 Esubtypes of E

public class SortedList<E extends Comparable<? super E>> {
   
    public int indexOf(E value) {
        ...
        else if (value.compareTo(this.get(minIndex)) > 1)...
    }
}

Java中的多重继承非常简陋,但确实存在:一个class可以实现多个接口。因此一个集合可以这样声明

ArrayList<Comparable<?>> list = new ArrayList<>();

然后您只能添加各种 class 实现 Comparable 的对象,而不必担心类型层次结构。

然而,以这种方式实现 Comparable 确实意味着存在一种方法 int compareTo(Object other),该方法的内部实现通常包括类型转换,并且不会接受任意输入。

现代 Java 建议改用 Comparable<ToSomething>,将您的可比对象限制在较窄的类别中。这个ToSomething也不一定是你的class的名字,可以是另外一个marker接口