为啥 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)100
是 200
。但是,似乎应该有比保留错误行为更好的理由。
【问题讨论】:
So is every Integer a Long?
- 不,long
是内存的两倍。
@August 但这是一个实现细节,当然允许不同。
基于substitutability principle,你的关系是倒退的。 Integer
应该扩展 Long
,因为当被要求提供 Long
时,您始终可以提供 Integer
,但不能反过来,因为某些 Long
值无效 Integer
值。
他们真的不需要。较小的基元具有扩大到较大的转换。
内置数字类镜像原始类型。原始类型之间没有继承关系,因此原始包装类之间没有继承关系。
【参考方案1】:
您的问题实际上可以通过两种不同的方式来处理:
如果我们谈论的是原语,那么你的关系是倒退的。
但是,如果您询问的是Integer
、Double
、Long
等类,那么所有数字之间都有关系。
重要的是要指出,Java 中作为对象的数字源自一个常见的 Number
类 here。像您描述的那样在层次结构中分解它们没有多大意义,因为所有数字之间的方法基本相同,尽管它们占用的内存大小不同。
简而言之,Java 中的层次结构是由类共享的关系(通常是方法)定义的,而不是它们在内存中占用的大小。
【讨论】:
【参考方案2】:因为没有什么可以继承。列出的每种类型都是它们自己独立的实体。例如,不能使用继承将 8 位值“扩展”为 32 位值。他们的任何共同点都继承自java.lang.Number
。
【讨论】:
【参考方案3】:当两个类之间存在“是”关系时,您可能会考虑使用继承 - 您可能有一个银行系统,其类名为 Account
和 SavingsAccount
- 储蓄账户就是一个账户。实际上,这意味着子类的任何对象也属于超类。
但是Integer
(32 位整数)和Long
(64 位整数)之间没有这种关系。 32 位整数不是 64 位整数;并且 64 位整数不是 32 位整数。因此,建议Integer
类和Long
类之间存在继承关系是没有意义的。
【讨论】:
以上是关于为啥 Java 的数字类不相互扩展?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Java webapps 使用 .do 扩展名?它从哪里来的?