【问题标题】:How to implement a List Class that only accepts Comparable Objects如何实现只接受可比较对象的列表类
【发布时间】:2021-03-20 06:13:27
【问题描述】:

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

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

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

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

这篇文章很接近帮助: Cannot find compareTo when receiving comparable Object[] 但它适用于一种特定的静态方法,而我需要整个类的对象是 Comparable 的,并且相同的添加似乎不适用于类头。

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

【问题讨论】:

    标签: java class generics interface comparable


    【解决方案1】:

    这样指定。这种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)...
        }
    }
    

    【讨论】:

    • 我真的以为我试过了哈哈,但它就像一个魅力。谢谢!我会尽可能标记为已接受。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      然后你可以只添加实现 Comparable 的各种类,而不用担心类型层次结构。

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

      现代 Java 建议改用 Comparable&lt;ToSomething&gt;,将 Comparables 限制在更窄的类别中。这个ToSomething也不需要是你的类名,可以是另外一个标记接口。

      【讨论】:

        猜你喜欢
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 2021-02-01
        相关资源
        最近更新 更多