具有多个参数的Java泛型

jjN*_*ord 6 java generics comparable

我在网站上看到过处理具有多个参数的泛型的示例,但没有一个适用于我的情况.

所以这是交易:我正在尝试学习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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以很明显我得到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

rat*_*eak 9

你可以像这样指定特定于函数的泛型参数

public static <T extends Comparable<? super T>> int binarySearch(T[] arr,T elem,int start,int end){
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • @ratchetfreak不完全是...它说,'T`可以是一个类型的东西,都是相当T`的`一些超类,同时迫使`arr`和`elm`仍然是一个数组和相同的元素类型. (4认同)

tru*_*ity 5

这是创建泛型函数的典型方法:

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

对于额外的通用性,item具有为相同类型的数组中的事情是,事情在阵列中不具有Comparable因为你不比较他们什么,所以

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

提供额外的灵活性.