比较两个通用数字的值

2022-08-31 14:09:40

我想与变量进行比较,两者都是.现在我想知道两个变量中哪一个大于另一个或等于。不幸的是,我还不知道确切的类型,我只知道它将是.我该怎么做?T extends Numberjava.lang.Number

编辑:我尝试了另一种使用s的解决方法,它实际上与自然排序一起工作(当然它有效,除了AtomicInteger和AtomicLong之外,所有实现的子类)。因此,我将丢失重复的值。使用 s 时,由于绑定不匹配,将不接受我的列表。非常不满意。TreeSetNumberComparableListCollection.sort()


答案 1

这应该适用于所有扩展 Number 的类,并且与它们本身相当。通过添加 &Compare,您可以删除所有类型检查,并与 Sarmun 答案相比免费提供运行时类型检查和错误抛出。

class NumberComparator<T extends Number & Comparable> implements Comparator<T> {

    public int compare( T a, T b ) throws ClassCastException {
        return a.compareTo( b );
    }
}

答案 2

一个有效的(但脆弱的)解决方案是这样的:

class NumberComparator implements Comparator<Number> {

    public int compare(Number a, Number b){
        return new BigDecimal(a.toString()).compareTo(new BigDecimal(b.toString()));
    }

}

但是,它仍然不是很好,因为它依赖于返回可解析的值(标准Java类可以这样做,但合约不需要)。toStringBigDecimalNumberNumber

编辑,七年后:正如评论中指出的那样,有三种特殊情况(至少?)需要您考虑:toString