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

Der*_*rry 3 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;
  }
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误说:二进制运算符的错误操作数类型'>'我应该怎么做?

shm*_*sel 12

您只能在数字类型上使用比较运算符.如果要比较泛型类型,则必须确保它们实现Comparable,并调用Comparable.compare():

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

compareTo() 将返回0表示相等的值,如果目标对象具有优先权,则返回<0;如果参数优先,则返回> 0.

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

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

compare()compareTo()上面的工作类似.

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

Collections.max(Arrays.asList(inputArray)/*, comparator*/)
Run Code Online (Sandbox Code Playgroud)