Java 泛型方法在数字比较时失败

Java generics method fails on number comparison

参见下面的小方法。 boo1 = ... 行运行良好,可能是因为它进行了对象 ID 比较。第二 boo2 = ... 行给出编译错误“Operator > cannot be applied to T,T”。我不明白为什么。毕竟 T extends Number(正如您在方法签名中看到的那样),所以像 > 这样的比较应该是可能的。我做错了什么?

public static <T extends Number> int[] where(T[] arr, T val) {
        if (arr == null || arr.length == 0) return null;

        boolean boo1 = arr[0] == val; //Compiles happily, as does "!="
        boolean boo2 = arr[0] > val;  //Doesn't compile (nor does ">=", "<", "<="

        return null;
    }

What am I doing wrong?

您假设关系运算符支持 Number 操作数;他们没有。只有 Number 框基元类型(例如 IntegerLong)可以;其他如 BigInteger 则没有。

您可以向 T 添加一个附加绑定以要求它是 Comparable:

<T extends Number & Comparable<T>>

并且你可以传入任何类型Numbers 都是Comparable:这包括Integer, LongBigInteger

那么你可以使用:

arr[0].compareTo(val) > 0

(但您可能会注意空值)。

此外,您不应该使用 ==!= 来检查 equality/inequality:请改用 equals

arr[0].equals(val)  // Instead of ==
!arr[0].equals(val) // Instead of !=

您也可以使用 arr[0].compareTo(val) ==/!= 0。事实上,这可能更好,因为例如BigIntegerBigDecimal 具有考虑比例的 equals 方法,因此 [1.00].equals([1.0]) 为假,而 [1.00].compareTo([1.0]) == 0 为真。最终,选择哪种方式取决于您要实现的目标。

这样试试:

public static <T extends Number> int[] where(T[] arr, T val) {
    if (arr == null || arr.length == 0) return null;

    boolean boo1 = arr[0] == val; //Compiles happily, as does "!="
    boolean boo2 = arr[0].intValue() > val.intValue();
    // Or doubleValue()

    return null;
}