【问题标题】:Why isn't Number class in Java an interface rather than an Abstract class? [closed]为什么 Java 中的 Number 类不是接口而不是 Abstract 类? [关闭]
【发布时间】:2017-08-12 00:06:41
【问题描述】:

我知道 byteValue() 和 shortValue() 的实现与其他抽象方法不同,并且是在 JDK1.1 中添加的。如果它是一个接口,这是不可能的。但是,当开发人员编写 Number 类时,他们为什么要把它变成一个抽象类呢?仅仅是因为他们预计以后可能会添加更多方法吗? 我只需要权威引用支持的答案。非常感谢大家花时间审查我的问题并给出答案。

【问题讨论】:

  • 他们可以把它变成一个接口而不是一个抽象类,但是一个具体的类是没有意义的。在 Java 8 之前,他们无法向接口添加实现。
  • 建议:如果您编辑您的问题以指定您只想要权威引用支持的答案(来自电子邮件列表的语言设计者的讨论等),那么您可以避免一些投票关闭为基于意见。
  • @yshavit 谢谢你的建议。
  • 您可能根本不喜欢这个答案,早在 Java 1 天,Sun 仍在学习设计 API 并且犯了许多错误。我往往不会真正质疑 Java 5 之前制作的旧类,它们来自不同的时代。

标签: java interface abstract-class


【解决方案1】:

这里没有人知道设计者的想法,但是抽象类和接口用于不同的目的。

类(在 Java 中)以严格的层次结构继承,这种层次结构是一种工具,可用于确保分离不相关的对象类。当整个层次结构的核心功能相似时,类也更符合逻辑。

例如,对于抽象类NumberLetter,不可能有一个两者兼有的类。使用接口可以创建一个实现两者的类,这是没有意义的。

另一方面,接口通常用于以正式的方式公开(通常)一小部分类,因此它们可以被仅使用接口中指定功能的可重用逻辑使用。它们更常用于添加支持功能,例如 SerializableComparableRunnable

例如,PrintableComparable 将是糟糕的抽象类,因为它不可能让 Comparable 对象也成为 Printable

因此设计者可能特别选择将Number 设为一个抽象类,以确保只有一个类层次结构可以是数字,而不能是其他任何东西。也许它可能允许 JDK 将这些类视为特殊情况的未来优化,就像它对 String 所做的那样。

【讨论】:

  • “这里没有人会知道设计师的想法”——他们中的一些人会时不时地在这里发帖,而且过去这样的答案有时会被引用到他们进行的电子邮件列表对话。至于作为数字和字母都没有意义的类......char 的工作方式与此类似(尽管Character 没有),所以我认为明确断言它没有意义是不公平的。
  • 也许我无法准确地说出它,但在设计类和接口时,我似乎出于特定原因选择了其中一个。我试过在这里概述这些。另一个值得一看的地方可能在这里:stackoverflow.com/questions/761194/…
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2012-08-20
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多