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

ご覧のとおり、Comparableインターフェイスで定義されたcompareTo()メソッドで要素を比較しているため、int[]配列のようなプリミティブ型を渡すことはできません。

最初の行(メソッド宣言)に気づきました:

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

これは、ジェネリックスに選択された規則にすぎません。有界型パラメーターを使用する場合は、extends(場合によっては実装を意味する場合もあります)またはsuperを使用します。

<E extends Comparable<E> & Cloneable>typeパラメーターを置き換えるオブジェクトがこれらの両方のインターフェースを実装するように定義するようなこともできます。

于 2010-07-24T20:29:11.450 に答える
5

実装するものを使用したい場合は、ジェネリックパラメータとして記述します。

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

あなたが話しているワイルドカードは3つです

  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 に答える