繁体   English   中英

为什么泛型类型参数说“扩展”可比较而不是“实现”? [重复]

[英]How come generic type parameter says “extends” Comparable not “implements”? [duplicate]

这个问题在这里已有答案:

我试着编写从数组中删除重复元素的泛型函数。

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接口中定义的compareTo()方法来比较元素。

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

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

它怎么说“扩展可比”?

可比较是一个接口,为什么它不“实现可比”? 这是我第一次编写泛型函数,所以我对这些细节感到困惑。 (任何疑惑都会阻止我理解..)

编辑:发现此文章与此主题相关。

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

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

您甚至可以执行类似<E extends Comparable<E> & Cloneable>来定义替换type参数的对象应该实现这两个接口。

如果你想使用实现的东西你只是写为通用参数

class Bar extends  Foo<String> { /* Code */}

您正在谈论的通配符是三个

  1. “?extends Type”:表示Type类型的子类型。 这是最有用的通配符
  2. “?super Type”:表示Type类型的超类型
  3. “?”:表示所有类型或任何类型的集合

你的方法应该是这样的

public static <T extends Comparable<? super T>> Collection<T> sort(T[] list) {

        Collection<T> list = new ArrayList<T>();

         //do quicksort
        Arrays.sort(arr);

        Collection<T> list = new ArrayList<T>();
        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
//btw how do You know that last is not duplicate 
        return list;

}

有关详细信息,请访问此页面

首先, E可能是一个界面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM