为啥 Java 的数字类不相互扩展?

Posted

技术标签:

【中文标题】为啥 Java 的数字类不相互扩展?【英文标题】:Why don't Java's number classes extend each other?为什么 Java 的数字类不相互扩展? 【发布时间】:2014-11-12 02:15:06 【问题描述】:

在 Java 中,为什么内置的数字类不相互扩展? Long 不应该扩展 Integer 扩展 Short 扩展 Byte,Double 扩展 Float 吗?

一般来说,当存在“is a”关系时,通常会使用继承。那么每个整数都是长整数吗?我想是的。

我能想到的唯一可能的解释是无法正确处理溢出。例如,(byte)100 + (byte)100-112,而 (short)100 + (short)100200。但是,似乎应该有比保留错误行为更好的理由。

【问题讨论】:

So is every Integer a Long? - 不,long 是内存的两倍。 @August 但这是一个实现细节,当然允许不同。 基于substitutability principle,你的关系是倒退的。 Integer 应该扩展 Long,因为当被要求提供 Long 时,您始终可以提供 Integer,但不能反过来,因为某些 Long 值无效 Integer 值。 他们真的不需要。较小的基元具有扩大到较大的转换。 内置数字类镜像原始类型。原始类型之间没有继承关系,因此原始包装类之间没有继承关系。 【参考方案1】:

您的问题实际上可以通过两种不同的方式来处理:

如果我们谈论的是原语,那么你的关系是倒退的。

但是,如果您询问的是IntegerDoubleLong 等类,那么所有数字之间都有关系。

重要的是要指出,Java 中作为对象的数字源自一个常见的 Number 类 here。像您描述的那样在层次结构中分解它们没有多大意义,因为所有数字之间的方法基本相同,尽管它们占用的内存大小不同。

简而言之,Java 中的层次结构是由类共享的关系(通常是方法)定义的,而不是它们在内存中占用的大小。

【讨论】:

【参考方案2】:

因为没有什么可以继承。列出的每种类型都是它们自己独立的实体。例如,不能使用继承将 8 位值“扩展”为 32 位值。他们的任何共同点都继承自java.lang.Number

【讨论】:

【参考方案3】:

当两个类之间存在“是”关系时,您可能会考虑使用继承 - 您可能有一个银行系统,其类名为 AccountSavingsAccount - 储蓄账户就是一个账户。实际上,这意味着子类的任何对象也属于超类。

但是Integer(32 位整数)和Long(64 位整数)之间没有这种关系。 32 位整数不是 64 位整数;并且 64 位整数不是 32 位整数。因此,建议Integer 类和Long 类之间存在继承关系是没有意义的。

【讨论】:

以上是关于为啥 Java 的数字类不相互扩展?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在 Java 中扩展注解?

为啥java类不从实现的接口继承注解?

为啥 Java 的基于值的类不应该被序列化?

为啥 Java webapps 使用 .do 扩展名?它从哪里来的?

为啥 Java 中的每个对象都隐式扩展 java.lang.Object 类?

Java序列化-java.io.InvalidClassException本地类不兼容[重复]