【问题标题】:Why interfaces have some methods of Object class? [duplicate]为什么接口有一些Object类的方法? [复制]
【发布时间】:2020-07-03 05:25:40
【问题描述】:

我发现Collection 接口有equalshashCode 方法,它们也包含在Object 中。 List 接口也是如此。我有以下疑问:

  1. 为什么接口应该有这些方法?是不是因为和Object里的意思不一样?
  2. 根据this 的问题,包括这些方法不会强制实现类提供它们的实现,因为这些实现已经提供并从Object 继承。因此,从技术上讲,将它们包含在接口中不会产生任何影响。这再次强调了第一个疑问的重要性,为什么接口需要有这些方法?

    This page 说:

    这些方法对对象的状态进行计算,但接口通常无法访问状态;只有实现类才能访问此状态。

    我觉得这进一步增加了第一个问题的重要性。

  3. 如果我们在接口中都需要它们,那么为什么 Java 框架没有包含它们的超接口而让这样的接口实现这个接口,就像所有类都是 Object 的子类一样?

【问题讨论】:

  • Java 语言规范对此进行了介绍。所有对象都继承自Object,因此所有接口的实现者都必须具有这些方法。隐式地,接口类型的对象必须具有它们。为了调用它们,接口调用必须编译。为了编译它们必须以某种方式存在于接口中。您可以猜测其余的基本原理。

标签: java


【解决方案1】:

List 接口声明 equals 和 hashCode 以便它可以记录实现必须遵循的额外约束。例如,List 接口文档要求 equals 方法必须将两个列表视为相等,如果它们具有相同的项目以相同的顺序,无论列表如何实现

编译器或运行时无法强制执行这些要求,因此破坏它们会导致可能难以发现的运行时错误。

【讨论】:

  • 所以这一切都是为了记录更多特定于这些类的内容。那就是Object.equals() 表示“指示其他一些 object 是否“等于”这个。而Collection.equals() 表示“将指定对象与此集合 进行比较是否相等。”。但他们实际上并没有执行任何事情,对吧?我的意思是Collectionequals(Object),而不是equals(Collection)
  • 没错,没有什么能阻止您以违反合同的方式实施 equals - 您可以轻松地违反 Object 中的一般合同和 List 中更具体的合同
  • 我猜这和Set having same methodsCollection 一样。这就是为什么doc 说“这些声明随附的规范已针对 Set 接口进行了定制,但它们不包含任何额外的规定。” Q1. 对吗? Q2. 但是我真的不明白扩展接口然后重新声明其所有方法的实践有什么意义!!??
  • 猜错了。 Set 继承自 Collection 的方法。与类一样,接口可以覆盖方法。在add 的情况下,声明的异常有所不同。
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2019-11-23
  • 2021-10-22
  • 2016-06-16
  • 2012-07-19
  • 2013-01-20
相关资源
最近更新 更多