首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Number类没有像add()或negate()这样的方法?

为什么Number类没有像add()或negate()这样的方法?
EN

Stack Overflow用户
提问于 2014-01-18 01:40:16
回答 5查看 626关注 0票数 10

这是一个关于Java设计的问题。

为什么在add()类上没有像negate()java.lang.Number这样的方法,但是在它的一些子类上呢?

我是说..。没有统一。我可以在+-操作符上使用FloatLong和其他自动装箱类,也可以在BigDecimalBigInteger上使用add()negate() (这违反了SRP)。

因此,如果我们允许在Byte/Short/Integer/Long上进行这些操作(包括自动装箱和操作符),那么为什么不只是在Number中添加一个abstract Number negate()

这有什么原因吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-01-18 04:41:12

最重要的是,保持向后兼容性。

您提到的这些方法不在java.lang.Number的第一个版本中,它们需要是抽象。为什么是抽象的?假设您在Number拥有negate()方法之前创建了自己的negate()子类,现在将negate()方法添加到Number中。如果negate()方法不是抽象的,那么在java.lang.Number中应该有一个通用的实现。它应该返回什么类型的对象?这是不可能的好决定。它应该是一个Double,像这样:public Number negate() { return new Double(this.doubleValue()); }吗?这会突然将您的ComplexNumber转换为否定的双倍。

添加抽象方法将无法工作,因为它会破坏现有的第三方Number子类,因此会破坏向后兼容性。

向后兼容性是许多看似明显的API改进现在无法实现的原因。

票数 2
EN

Stack Overflow用户

发布于 2014-01-18 01:56:48

我想可能是因为以下原因。

Number也是AtomicIntegerAtomicLong的一个超类.如果Number有一个add()方法,那么这些子类也必须实现它,这在保持原子性的同时是不可能的。

相反,这两个类将addAndGet()实现为单个原子操作。

票数 5
EN

Stack Overflow用户

发布于 2014-01-18 02:00:30

简而言之,这是因为您不知道从二进制操作返回什么类型。

当您添加两个相同类型的Number子类时,返回类型是毫无疑问的。但是,对两个不同类型的Number实现的操作会产生多个分派问题(也就是说,每个类都需要知道如何处理Number的所有其他子类)。

这将是困难的,但不是不可能的。不可能的是处理用户定义的Number子类。由于Number是一个接口,用户可以自由地创建自己的实现。排除它们太不一致;不可能包含它们,因为库设计人员无法了解它们。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21198995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档