java—如何实现只接受可比较对象的列表类

bpsygsoo  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(330)

我正在实现一个泛型arraylist类,它将遵循给定元素的自然顺序。我假设有某种方法可以做到这一点,类似于treeset如何遵循给定元素的自然顺序。
当我对存储在中的对象使用.compareto方法调用时,出现一个错误,表示“无法解析'e'中的'compareto'方法”。我如何告诉编译器对象e应该只是实现可比较接口的类?
现在,相关代码如下所示:

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

这篇文章很有帮助:在接收comparable object[]时找不到compareto,但它只适用于一个特定的静态方法,而我需要整个类的对象具有可比性,同样的添加似乎不适用于类头。
有什么我可以添加到类头执行类似的功能吗?

mpbci0fu

mpbci0fu1#

您必须要求您的类型参数与其自身具有可比性(因此它具有自然顺序)。可以通过限定参数来实现这一点。

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

yi0zb3m42#

这样指定。这个 bounded 类型允许两者 E 以及 subtypes of E 进行比较。

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

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

m3eecexj3#

java中的多重继承非常简单,但确实存在一些问题:一个类可以实现多个接口。因此,集合可以这样声明

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

然后,您只能添加实现与之相当的各种类,而不必考虑类型层次结构。
然而,这种方法的实现意味着有一种方法 int compareTo(Object other) ,此方法的内部实现通常包括类型转换,并且不接受任意输入。
现代java建议使用 Comparable<ToSomething> 相反,把你的可比性限制在更窄的范畴内。这个 ToSomething 也不需要是你的类名,可以是另一个标记接口。

相关问题