为什么java.lang.Number不实现Comparable?

这个问题在这里已经有了答案:

  • 比较两个通用数字的值11个答案

  • 值得一提的是下面的表达式:

    new Long(10).equals(new Integer(10))
    

    总是false ,这往往会在某个点或另一个地方让每个人都出现。 所以你不仅可以比较任意的Number但你甚至不能确定它们是否相等。

    另外,对于真实的原始类型( floatdouble ),确定两个值是否相等是棘手的,必须在可接受的误差范围内完成。 尝试如下代码:

    double d1 = 1.0d;
    double d2 = 0.0d;
    for (int i=0; i<10; i++) {
      d2 += 0.1d;
    }
    System.out.println(d2 - d1);
    

    你会留下一些小的差异。

    所以回到制作Number Comparable的问题。 你将如何实现它? 使用类似doubleValue()东西不会可靠。 记住Number子类型是:

  • Byte ;
  • Short
  • Integer ;
  • Long ;
  • AtomicInteger ;
  • AtomicLong ;
  • Float ;
  • Double ;
  • BigInteger ; 和
  • BigDecimal
  • 你能编写一个可靠的compareTo()方法吗?它不会变成一系列if instanceof语句吗? Number实例只有六种可用的方法:

  • byteValue() ;
  • shortValue() ;
  • intValue() ;
  • longValue() ;
  • floatValue() ; 和
  • doubleValue()
  • 所以我猜Sun会做出(合理的)决定: Number s只能Comparable自己的实例相Comparable


    有关答案,请参阅Java bugparade错误4414323.您还可以从comp.lang.java.programmer中找到讨论

    引用Sun对2001年错误报告的回应:

    所有的“数字”都没有可比性; 可比较假定可能的总数排序。 这甚至不是浮点数; NaN(不是数字)既不小于,也不大于,也不等于任何浮点值,甚至本身。 {Float,Double} .compare强加的总排序与浮点“<”和“=”运算符的排序不同。 另外,按照目前的实现,Number的子类只能与同一类的其他实例相比。 还有其他一些情况,如复数,其中没有标准的总排序,尽管可以定义一个。 简而言之,Number的子类是否具有可比性应作为该子类的决定。


    为了在数量上实现可比性,您必须为每个子类对编写代码。 它更容易,而不是让子类来实现可比较的。

    链接地址: http://www.djcxy.com/p/91927.html

    上一篇: Why doesn't java.lang.Number implement Comparable?

    下一篇: When should a class be Comparable and/or Comparator?