【问题标题】:How can a custom parameterized list object be created in Java with Comparables?如何使用 Comparables 在 Java 中创建自定义参数化列表对象?
【发布时间】:2014-02-25 21:28:54
【问题描述】:

我正在尝试在 Java 中创建一个自定义列表对象,该对象在“”中具有参数化类型(如 ArrayLists)。但是,这些参数化类型需要实现 Comparable 接口(因为列表会自动排序和组织)。

我遇到的问题是语法并确保 1) 列表元素是可比较对象,而不仅仅是任何对象,以及 2) 像 @987654321 这样的 getter 方法@ 应该返回列表类型的对象而不需要强制转换,即,如果使用 < Integer > 参数化创建列表,get() 的返回类型应该是 Integer,而不是 Comparable 或 Object。

我知道 Java 中的参数化对象可以使用 < E >< T > 之类的东西创建,但这不允许我要求列表的元素是 Comparable。

顺便说一句,如果您有任何 cmets,例如“只需使用 ArrayList 或 LinkedList”。或“你为什么要使用自定义列表,笨蛋?”,请自己保密。我想创建一个不适合任何现有结构的组织良好、高效的列表系统。 Comparable 要求是列表自动排序所必需的。

如果有人能告诉我如何做到这一点,将不胜感激。

【问题讨论】:

  • 你能告诉我们你创建的类的骨架吗

标签: java list generics comparable parameterized


【解决方案1】:

可比对象:

<V extends Comparable<V>>

【讨论】:

    【解决方案2】:

    在定义类型参数时,您可以使用extends 关键字来指定您的类只能接受具有特定超类型(在您的情况下为Comparable)的类型参数。
    至于get 方法——只需使用与返回类型相同的类型参数即可。例如:

    public class MyList<T extends Comparable<T>> {
    
        public T get(int index) {
            ...
        }
    }
    

    【讨论】:

      【解决方案3】:

      您应该使用Comparable 的上限声明您的泛型类型参数,以保证项目是Comparable。但是,Comparable itself has a type parameter,通常是给自己的。例如。 Integer 实现 Comparable&lt;Integer&gt;

      T extends Comparable&lt;T&gt; 有效吗?当然,但如果Superclass implements Comparable&lt;Superclass&gt;,那么子类Subclass 也实现Comparable&lt;Superclass&gt;。为了解决这种可能性,请引入一个下限为 T 的通配符。

      public class CustomParameterizedList<T extends Comparable<? super T>>
      

      这遵循标准 Java 中的现有模式,例如 Collections.sort,它对 T 的定义类似。

      public static <T extends Comparable<? super T>> void sort(List<T> list)
      

      Java Generics tutorial has explanations 关于为什么&lt;T extends Comparable&lt;? super T&gt;&gt;&lt;T extends Comparable&lt;T&gt;&gt; 更灵活。

      T 没有必要与它本身完全可比。所需要的只是 T 与其超类型之一相当。这给了我们:

      public static <T extends Comparable<? super T>> 
              T max(Collection<T> coll)
      

      【讨论】:

      • 我明白了。感谢您的扩展描述。这很有帮助。我觉得奇怪的是使用关键字 extends 而不是 implements 考虑到 Comparable 是一个接口,但编译器接受它。我想我也可以按照您的建议使用通配符。再次感谢。
      • 这是 Java 泛型的怪癖之一,因为“扩展”在指定上限时适用于类和接口。更多详情,请参阅Java generics - why is “extends T” allowed but not “implements T”?
      猜你喜欢
      • 2021-12-19
      • 2015-11-16
      • 2020-03-16
      • 2020-11-07
      • 2022-01-11
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多