为什么泛型类型参数说"扩展"可比较而不是"实现"?

mas*_*san 11 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {
Run Code Online (Sandbox Code Playgroud)

它怎么说"扩展可比"?

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

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

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

And*_*anu 10

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

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


Dam*_*ash 5

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

class Bar extends  Foo<String> { /* Code */}
Run Code Online (Sandbox Code Playgroud)

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

  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;

}
Run Code Online (Sandbox Code Playgroud)

对于detali请求访问此页面