11

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

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

4

3 回答 3

10

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

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

于 2010-07-24T20:29:11.450 回答
5

如果您想使用实现您只需编写的东西作为通用参数

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;

}

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

于 2010-07-24T20:25:52.187 回答
1

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

于 2010-07-24T20:14:14.297 回答