为什么Number不使用Comparable / Comparator

时间:2015-03-17 09:13:34

标签: java

简短的问题;

我已经阅读了可比较和比较器的Javadocs,但我并不了解这些差异。 Comparable抛出NullPointerException,Comparable由更多的类实现,因此它的方法更容易获得,它们是唯一的区别吗?

我的问题的第二部分是为什么没有数字实现可比较但像BigDecimal那样的东西呢?似乎只有AtomicInteger和AtomicLong不会从Number类实现Comparable。这是为什么?为什么不是原子'类可比较吗?

长问题;

我问这个是因为我试图从J-Interop中取一个JIVariant  将它转换为一个Object(有可能是一个布尔值,字符串或数字),以便在返回时轻松显示和执行切换,如果它是一个数字我希望使用关系运算符来确定它与每个人的比较运算符。

我的测试显示,除​​非您使用Comparable的compareTo(),否则无法比较非基元。

我很想将数字转换为不太通用的数字,以便为我提供我需要的功能,但我担心溢出和内存使用情况。我想要去BigDecimal,但我知道Floats有浮点精度问题。经验更丰富的StackOverflow成员如何处理这个问题?

2 个答案:

答案 0 :(得分:2)

当一个类实现可比较时,只有一个compareTo()方法。您不能在一个类中定义两个或更多compareTo()方法。如果您想比较其他一些值怎么办?然后,您可以使用比较器接口实现新类,以将其与其他值一起使用。在这种情况下,比较器接口会起到帮助作用。

Number是一个抽象类 - 没有什么可比的。这个类由Integer,Double等具体的classess扩展 - 这个classess具有可比较的具体值。

以下是如何使用这两个界面的一个很好的例子: http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html

答案 1 :(得分:0)

这两个问题之前已被多次询问过。请记住,Google是您的朋友。

它们的用法,逻辑和实现各不相同。

enter image description here

可以在this site上找到比较和示例。

至于问题的第二部分,请查看this SO question。它解释了为什么Number类没有实现Comparable接口。