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
框基元类型(例如 Integer
、Long
)可以;其他如 BigInteger
则没有。
您可以向 T
添加一个附加绑定以要求它是 Comparable
:
<T extends Number & Comparable<T>>
并且你可以传入任何类型Number
s 和都是Comparable
:这包括Integer
, Long
、BigInteger
等
那么你可以使用:
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
。事实上,这可能更好,因为例如BigInteger
和 BigDecimal
具有考虑比例的 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;
}
参见下面的小方法。 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
框基元类型(例如 Integer
、Long
)可以;其他如 BigInteger
则没有。
您可以向 T
添加一个附加绑定以要求它是 Comparable
:
<T extends Number & Comparable<T>>
并且你可以传入任何类型Number
s 和都是Comparable
:这包括Integer
, Long
、BigInteger
等
那么你可以使用:
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
。事实上,这可能更好,因为例如BigInteger
和 BigDecimal
具有考虑比例的 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;
}