【问题标题】:Java generics with multiple parameters具有多个参数的 Java 泛型
【发布时间】:2012-05-06 22:58:18
【问题描述】:

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

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

【问题讨论】:

  • 只是告诉你,如果你传入一个零长度或空数组,这将失败。
  • 是的,这是一个简单的例子——我对多个泛型的概念感兴趣,而不是二分搜索。不过还是谢谢。

标签: java generics comparable


【解决方案1】:

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

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

【讨论】:

  • 为这个做什么?只是好奇——我经常看到它,但从来没有解释过。
  • 这是一些额外的类型安全性并允许更大的灵活性,因此您可以传递一个超类实现 Comparable 的东西的数组
  • @ratchetfreak 不完全是......这是说T 可以是一种与T 的超类相当的东西,同时强制arrelm 仍然是一个数组和一个相同类型的元素。
  • @trutheality:rathetfreak 所说的是发生这种情况的常见情况。人们通常编写与自己相当的类。因此,如果T 可与T 的超类相媲美,那通常是因为T 的超类与自身具有可比性,而T 只是继承了它。
【解决方案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) { ... }

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

【讨论】:

  • 不错!我也想知道。对于上下文,我认为更严格的方法会更好,但很高兴知道。谢谢。
  • 很好的答案,但只是打了一拳,不过我会为你的答案加分,非常感谢。
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2018-05-15
  • 2017-10-06
  • 2013-05-09
相关资源
最近更新 更多