为什么java.lang.Number不实现Comparable?
这个问题在这里已经有了答案:
值得一提的是下面的表达式:
new Long(10).equals(new Integer(10))
总是false
,这往往会在某个点或另一个地方让每个人都出现。 所以你不仅可以比较任意的Number
但你甚至不能确定它们是否相等。
另外,对于真实的原始类型( float
, double
),确定两个值是否相等是棘手的,必须在可接受的误差范围内完成。 尝试如下代码:
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