gpt4 book ai didi

java - 运算符 < 未定义参数 Number, int

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:48 24 4
gpt4 key购买 nike

我是不是太聪明了?

  private static <T extends Number> Long extractLong(T value) {
if ( value < Long.MIN_VALUE || value > Long.MAX_VALUE ) { // <= compile error
throw new NumberFormatException("Conversion from " + value + " to Long will overflow");
}
return value.longValue();
}

产生编译错误:

The operator > is undefined for the argument type(s) T, long

但如果我显式执行该函数,它会编译:

  private static Long extractLong(Long value) {
if ( value < Long.MIN_VALUE || value > Long.MAX_VALUE ) {
throw new NumberFormatException("Conversion from " + value + " to Long will overflow");
}
return value.longValue();
}

最佳答案

由于 Java 不支持运算符重载,因此无法定义比较运算符的含义 <>对于任何类型的对象。或者换句话说:

Number a = new Long(1);
Number b = new Long(2);
if (a < b) // does NOT compile - objects cannot be compared using `<` or `>`!

第二个示例编译的原因是 autoboxing . Long对象自动转换为 long当然,这些值与您所做的具有可比性。但是由于 Number 类型的对象没有通用的自动装箱, 这在第一种情况下不起作用。

那么我们如何检查溢出呢?我认为最简单的方法是检查 double值(value)第一:

private static long extractLong(Number value) {
double v = value.doubleValue();
if (v < Long.MIN_VALUE || v > Long.MAX_VALUE) {
throw new NumberFormatException(...);
}
return value.longValue();
}

请注意,这不包括 value 的情况。是一个非常大的BigDecimalBigInteger不能表示为 double任何一个。因此你需要做 instanceof也检查。

警告:此测试使用doubleValue()value 时不起作用略大于Long.MAX_VALUE (或略小于 Long.MIN_VALUE )。原因是由于浮点值的性质,从整数或小数转换为 double不准确。更具体地说,所有值都来自 Long.MAX_VALUE - 511Long.MAX_VALUE + 1025将被转换为一个相同的 double 值 ( 9.223372036854776E18 )。示例:

double d1 = Long.MAX_VALUE - 511;
double d2 = Long.MAX_VALUE;
double d3 = BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.valueOf(1025)).doubleValue();
// d1 == d2 == d3 due to lack of precision of double!

但这意味着,上面的表达式 v > Long.MAX_VALUE将是 false对于所有这些值,尽管其中一些实际上大于 Long.MAX_VALUE :

long l = extractLong(BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE));
// l is now -9223372036854775808 => overflow check failed!

旁注:这里没有必要使用泛型!只需使用 Number直接代替 T你可以传递各种数字。多亏了多态性,这从 Java 1.0 开始就有效了……;)

关于java - 运算符 < 未定义参数 Number, int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25035413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com