比较两个通用数字的值

新手上路,请多包涵

我想与类型为 T extends Number 的变量进行比较。现在我想知道这两个变量中的哪个大于或等于另一个。不幸的是我还不知道确切的类型,我只知道它将是 java.lang.Number 的子类型。我怎样才能做到这一点?

编辑:我尝试了另一种解决方法,使用 TreeSet s,它实际上使用自然排序(当然它有效,所有子类 Number 实现 Comparable 除外原子长)。因此,我将丢失重复值。当使用 List s, Collection.sort() 由于绑定不匹配,将不接受我的列表。很不满意。

原文由 b_erb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 630
2 个回答

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

 class NumberComparator implements Comparator<Number> {

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

}

不过,它仍然不是很好,因为它依赖于 toString 返回一个可由 BigDecimal 解析的值(标准 Java Number Number 合同没有要求)。

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

原文由 gustafc 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

原文由 BennyBoy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏