那么这是一个关于
Java设计的问题.
为什么java.lang.Number类中没有add()和negate()等方法,但是有一些子类呢?
我的意思是…没有统一性.我可以在Float,Long和其他autoBoxeable类上使用or操作符,我可以在BigDecimal或BigInteger(它违反SRP)的情况下使用add()和negate().
所以如果我们允许这些操作在Byte / Short / Integer / Long(带有自动装箱和运算符)上,那为什么不只是在Number中添加一个抽象的Number()和
有没有理由呢?
解决方法
最重要的是要保持向后兼容性.
您提到的这些方法不在java.lang.Number的第一个版本中,它们需要是抽象的.
为什么抽象?假设你创建了你自己的ComplexNumber子类,然后它有一个negate()方法,现在一个否定()方法被添加到Number.
如果negate()方法不是抽象的,那么在java.lang.Number中应该有一个它的一般实现.应该返回什么类型的对象?这是没有可能的好的决定.如果它是一个Double,像这样:public Number negate(){return new Double(this.doubleValue()); }?这将会将您的ComplexNumber突然转换为双倍的否定值.
并且添加抽象方法将不起作用,因为它将破坏Number的现有第三方子类,因此会破坏向后兼容性.
向后兼容性是现在似乎很明显的很多可能的API改进无法实现的原因.