我想比较两种类型的变量T extends Number.现在我想知道这两个变量中哪一个大于另一个或相等.不幸的是我还不知道确切的类型,我只知道它将是一个子类型java.lang.Number.我怎样才能做到这一点?
编辑:我试图用另一种解决方法TreeSets,这实际上自然排序工作(当然它的工作原理,所有的子类Number实现Comparable除的AtomicInteger和AtomicLong的).因此,我将丢失重复值.使用Lists时,Collection.sort()由于绑定不匹配,不接受我的列表.非常不满意.
在Java中,所有数字类型都从java.lang.Number扩展.拥有如下方法是一个好主意:
public boolean areEqual(Number first, Number second) {
if (first != null && second != null) {
return first.equals(second);
}
}
Run Code Online (Sandbox Code Playgroud)
我担心双重2.00000不等于int 2的情况.这些是由内置等于处理吗?如果没有,有没有办法在java中编写一个简单的数字比较函数?(apache commons等外部库都可以)
可能重复:
比较两个通用数字的值
我想比较两个任意的Number实例来找出哪个更大.如您所知,这些可能是整数,长整数或双数,但也可能是BigIntegers或BigDecimals.那么该怎么办?
doubleValue()因为BigDecimals或BigIntegers可能会丢失精度.我真的必须进行实例测试和投射吗?这里必须有一些库,做到这一点.但我已经检查过Apache Commons和Guava没有运气.
编辑1:评论指出了这一点:比较两个通用数字的值.它有一个解决方案,使用将所有内容转换为BigDecimal toString().真的没有更好的方法吗?
编辑2:我刚发布了自己的版本作为另一个问题的答案.它应该比公认的答案更有效和更强大.
在 Kotlin 中,该Number类型听起来非常有用:每当我需要数字时就可以使用的类型。
然而,当实际使用它时,我很快发现它毫无用处:我无法对这些数字使用任何运算符。一旦我需要对它们做一些事情,我就需要显式地转换它们(即使是为了比较)。
为什么语言设计者选择不在规范中包含运算符Number?
考虑到这一点,我注意到实现起来可能很棘手Number.plus(n: Number): Number,因为n可能与 属于不同的类型this。
另一方面,这样的实现确实存在于我检查的所有Number子类型中。当然,如果我想输入,它们是必要的1 + 1.2,这会调用Int.plus(d: Double): Double
.toDouble()对我来说,结果是每次使用号码时都必须拨打。这使得代码难以阅读(a.toDouble() < b.toDouble()与相比a < b)。
是否有任何技术原因导致运算符被省略Number?