java - 为什么通用类型参数说 "extends"Comparable 而不是 "implements"?

标签 java generics comparator

<分区>

我尝试编写从数组中删除重复元素的通用函数。

public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {
    //do quicksort
    Arrays.sort(arr);
    ArrayList<E> list = new ArrayList<E>();
    int i;
    for(i=0; i<arr.length-1; i++) {
        if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list
            list.add(arr[i]);
        }
    }
    list.add(arr[i]); //add last element
    return list;
}

如您所见,您不能传递像 int[] 数组这样的原始类型,因为我正在通过 Comparable 接口(interface)中定义的 compareTo() 方法比较元素。

我注意到第一行(方法声明):

public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {

为什么说“扩展可比较”?

Comparable 是一个接口(interface),为什么不“实现 Comparable”呢?这是我第一次编写通用函数,所以我对这些细节有点困惑。 (任何疑惑都会阻止我理解..)

编辑:找到与此主题相关的这篇文章。

http://www.tutorialspoint.com/java/java_generics.htm

最佳答案

这只是为泛型选择的约定。使用有界类型参数时,您可以使用 extends(即使在某些情况下它可能意味着实现)或 super。

你甚至可以做类似 <E extends Comparable<E> & Cloneable> 的事情定义将替换类型参数的对象应该实现这两个接口(interface)。

关于java - 为什么通用类型参数说 "extends"Comparable 而不是 "implements"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3326703/

相关文章:

angular - 无法在 TypeScript 中为 Map<TKey, TValue[]> 编写扩展方法

java - 比较器不会删除 TreeSet 中的数字重复项

c++ - std::sort 比较器,它查看元素的(原始)索引

java - java中Comparator中super的使用

java - 编码-解码字符串

java - 如何获取映射到标准输出/错误的文件?

java - 结果集和语句未在 Java 中关闭的影响

c# - 通用集合中的通用类型

java - 显示ListView的子项和标题

Java map 通用