有谁知道为什么 java.lang.Number不实施Comparable?这意味着你无法排序Numbers的Collections.sort这对我来说有点陌生.
发布讨论更新:
java.lang.Number未实现Comparable的原因的最简单解释源于可变性问题.
对于位的检讨,java.lang.Number是抽象的超类型的AtomicInteger,AtomicLong,BigDecimal,BigInteger,Byte,Double,Float,Integer,Long和Short.在那个列表上,AtomicInteger并AtomicLong没有实现Comparable.
四处搜索,我发现Comparable在可变类型上实现这不是一个好习惯,因为对象在比较期间或之后可能会发生变化,因此比较结果无用.这两个AtomicLong和AtomicInteger是可变的.API设计者已经预见到没有Number实现,Comparable因为它会限制未来子类型的实现.确实,AtomicLong并且AtomicInteger在java.lang.Number最初实现之后很久就被添加到Java 1.5中.
除了可变性之外,这里也可能有其他考虑因素.一compareTo实施Number就必须促进所有的数字值BigDecimal,因为它是能够容纳所有的Number子类型.这种促销在数学和表现方面的含义对我来说有点不清楚,但我的直觉发现了解决方案.
在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:我刚发布了自己的版本作为另一个问题的答案.它应该比公认的答案更有效和更强大.