为什么这个泛型方法在Java数组中找不到最大的编译方法?

时间:2017-08-23 01:57:19

标签: java arrays generics

我试图在Java中学习泛型,我会认为这种方法可以用于查找数组中的最大值:

  public static <T> T largestInArray(T[] inputArray){
    T largest = inputArray[0];
    for (int i = 1; i < inputArray.length - 1; i++){
      if (inputArray[i] > largest)
        largest = inputArray[i];
    }
    return largest;
  }

但我得到一个错误说:二进制运算符的错误操作数类型&#39;&gt;&#39;我该怎么做?

2 个答案:

答案 0 :(得分:12)

您只能在数字类型上使用比较运算符。如果您想比较通用类型,则必须确保他们实施Comparable,并致电Comparable.compare()

public static <T extends Comparable<? super T>> T largestInArray(T[] inputArray) {
    //...
    if (inputArray[i].compareTo(largest) > 0) {
    //...
}

compareTo()将返回0表示相等的值,&lt;如果目标对象具有优先权,则为0,并且>如果参数优先,则为0。

或者,您可以使用自定义Comparator,而不是依赖于自然顺序:

public static <T> T largestInArray(T[] inputArray, Comparator<? super T> comparator) {
    //...
    if (comparator.compare(inputArray[i], largest) > 0) {
    //...
}

compare()与上面的compareTo()类似。

请注意,这些都已经实现为Collections帮助程序,您可以通过包装数组轻松调用它们:

Collections.max(Arrays.asList(inputArray)/*, comparator*/)

答案 1 :(得分:2)

由于Java仅为数字类型定义了比较运算符><>=<=,因此您无法将它们应用于对象,包括通用对象。

相反,您需要告诉编译器T的对象将实现Comparable<T>接口。您将无法使用>,但您可以通过致电compareTo来完成所需操作:

if (inputArray[i].compareTo(largest) > 0) // Replaces inputArray[i] > largest