有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个参数的Java泛型

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

所以这里是交易:我正在尝试学习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;
    }
}

很明显,我收到了原始类型的警告,说泛型应该参数化。考虑到我有多个参数,它们都需要是相同的类型,我如何才能正确地做到这一点

解决方案

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

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

共 (2) 个答案

  1. # 1 楼答案

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

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

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

    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) { ... }
    

    提供了一些额外的灵活性