具有多个参数的Java泛型

具有多个参数的Java泛型,java,generics,comparable,Java,Generics,Comparable,我在网站上看到过处理具有多个参数的泛型的例子,但没有一个适合我的情况 所以这里是交易:我试图学习Java泛型,并决定创建一个简单的二进制数组搜索实用程序函数。我正在使用自定义对象和整数进行测试。为了获得关于错误和警告的反馈,我正在使用Eclipse。以下是我所拥有的: public static int binarySearch(Comparable[] array, Comparable item, int start, int end) { if(end < start) {

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

所以这里是交易:我试图学习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;
    }
}
公共静态int-binarySearch(可比[]数组、可比项、int-start、int-end){
如果(结束<开始){
返回-1;
}
int mid=(开始+结束)/2;
if(item.compareTo(数组[mid])>0){
返回二进制搜索(数组、项、mid+1、结束);
}else if(item.compareTo(数组[mid])<0){
返回二进制搜索(数组、项、开始、mid-1);
}否则{
中途返回;
}
}
很明显,我得到了原始类型的警告,说泛型应该参数化。考虑到我有多个参数,它们都需要是相同的类型,我如何才能正确地做到这一点

解决方案

以下是使用具有正确参数检查的泛型的工作解决方案:

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

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

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

提供了一些额外的灵活性。

您可以像这样指定特定于函数的通用参数

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

public static只是让您知道,如果您传入一个零长度或空数组,这将失败。是的,这是一个微不足道的例子-我感兴趣的是多泛型的概念,而不是二进制搜索。不过还是要谢谢你。这是一种额外的类型安全性,允许更大的灵活性,这样你就可以传递一个超类实现的数组了Comparable@ratchetfreak不完全是。。。这意味着
T
可以是一种类似于
T
的超类的东西,同时迫使
arr
elm
仍然是一个数组和相同类型的元素。@trutheality:rathetfank所说的是发生这种情况的通常情况。人们通常编写与自己相当的课程。因此,如果
T
T
的超类可比,这通常是因为
T
的超类与自身可比,而
T
只是继承了它。很好!我也在想。就上下文而言,我认为更严格的方法会更好,但知道这一点很好。谢谢。回答得很好,但要切中要害,不过我会把你的答案加上去的,非常感谢。
public static <T extends Comparable<? super T>> int binarySearch(T[] arr,T elem,int start,int end){
    //...
}