【问题标题】:How come generic type parameter says "extends" Comparable not "implements"? [duplicate]为什么泛型类型参数说“扩展”可比较而不是“实现”? [复制]
【发布时间】:2011-03-20 14:16:33
【问题描述】:

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

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) {

怎么会说“扩展可比”?

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

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

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

【问题讨论】:

  • 因为implements extends extends

标签: java generics comparator


【解决方案1】:

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

您甚至可以执行&lt;E extends Comparable&lt;E&gt; &amp; Cloneable&gt; 之类的操作来定义将替换类型参数的对象应实现这两个接口。

【讨论】:

    【解决方案2】:

    如果你想使用实现你刚才写的东西作为泛型参数

    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;
    
    }
    

    详情请访问this page

    【讨论】:

    • 感谢您的提示。回答你的问题,“我怎么知道最后一个不是重复的”:如果排序后的数组包含 A、B、B 1。我把 A 放到 arraylist 中。 2 . 跳过第二个 B,因为 index[1] 和 index[1+1] 相同。 3.跳出循环。 4.添加最后一个索引(也就是最后一个B)
    【解决方案3】:

    一方面,E 可能是一个接口。

    【讨论】:

    • 当然是一句话。它有主语、动词和宾语。这也是一个正确的答案。你有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多