6

複数のパラメーターを持つジェネリックを扱う例をサイトで見ましたが、私の状況ではうまくいきません。

これが取引です。私はJavaジェネリックを学ぼうとしていて、単純なバイナリ配列検索ユーティリティ関数を作成することにしました。カスタムオブジェクトと整数を使用してテストしています。エラーと警告に関するフィードバックを得るために、私はEclipseを使用しています。これが私が持っているものです:

public static int binarySearch(Comparable[] array, Comparable item, int start, int end) {
    if(end < start) {
        return -1;
    }
    int mid = (start + end) / 2;
    if(item.compareTo(array[mid]) > 0) {
        return binarySearch(array, item, mid + 1, end);
    } else if(item.compareTo(array[mid]) < 0) {
        return binarySearch(array, item, start, mid - 1);
    } else {
        return mid;
    }
}

したがって、明らかに、ジェネリックをパラメーター化する必要があるというRawタイプの警告が表示されます。同じタイプである必要がある複数のパラメーターがある場合、これを正しく行うにはどうすればよいですか?

解決

ジェネリックスと正しいパラメータチェックを使用した実用的なソリューションは次のとおりです。

public static <T extends Comparable<? super T>> int binarySearch(T[] array, T item, int start, int end) {
    if(array.length == 0) {
        return -1;
    }
    if(item == null) {
        return -1;
    }
    if(start < 0) {
        return -1;
    }
    if(end < start) {
        return -1;
    }
    int mid = (start + end) / 2;
    if(item.compareTo(array[mid]) > 0) {
        return binarySearch(array, item, mid + 1, end);
    } else if(item.compareTo(array[mid]) < 0) {
        return binarySearch(array, item, start, mid - 1);
    } else {
        return mid;
    }
}
4

2 に答える 2

9

このように関数固有の汎用パラメーターを指定できます

public static <T extends Comparable<? super T>> int binarySearch(T[] arr,T elem,int start,int end){
    //...
}
于 2012-05-06T23:05:53.173 に答える
5

これは、ジェネリック関数を作成するための一般的な方法です。

public static <T extends Comparable<? super T>> int binarySearch(T[] array, T item, int start, int end) { ... }

さらに一般的に言うと、配列内のものと同じタイプである必要itemはありませ。また、配列内のものは、他のものと比較していないため、同じタイプである必要はありません。Comparable

public static <T> int binarySearch(T[] array, Comparable<T> item, int start, int end) { ... }

いくつかの追加の柔軟性を提供します。

于 2012-05-06T23:05:39.260 に答える