Java 8中接口上的抽象类的首选项

Adi*_*ngh 6 java abstract-class interface diamond-problem java-8

现在,我们知道Java 8在接口中引入了默认和静态方法.
接口最初是用Java引入的,以避免在多重继承中C++中出现的菱形问题.

但是随着Java 8中接口中引入默认方法,Java现在也引入了钻石问题,这在以前的版本中已经避免了.

不会强制要求覆盖默认方法.
但是当钻石问题使用接口时,实现这些接口的类必须覆盖默认方法.

所以现在,我脑子里有三个问题:

  1. 为什么需要默认方法?
  2. 难道我们不能通过类本身进行多重继承,而不是在接口中使用默认方法吗?
  3. 如果他们不得不在Java 8中引入钻石问题,那么在以前版本中需要避免钻石问题的是什么?

有任何好的解释或任何解释链接?

PS我没有在互联网上找到任何包含任何好文章的链接.
他们所说的只是一个抽象的课程让你更具体.
就像在,抽象类可以有构造函数,但接口不能.

所以,我想知道,如果抽象类更具体,并且可以有构造函数,
并且无论如何Java引入了钻石问题,为什么我们现在应该有接口?作为多重继承的独立,抽象类不是很好吗?

JB *_*zet 15

不,它没有重新引入钻石问题,因为接口仍然不能有任何状态,默认方法可能不是最终的.

因此,当您选择实现两个接口时,您仍然可以通过选择一个提供的默认实现或提供自己的实现来实现默认方法的所有自由.但是,您永远不会遇到从两个接口继承冲突状态或继承两个不同的最终方法而无法解决冲突的问题.

那么,以下是您的问题的答案:

  1. 为了能够在现有接口中引入新方法而不破坏向后兼容性:现有实现将自动实现这些方法,因为它们的实现位于基接口中.
  2. 不,因为这会引入钻石问题.
  3. 不相干

  • 但是使用类来重新引入钻石问题,因为突然你会从两个类继承冲突状态,并且一个或两个方法可能是最终的(因此无法覆盖).无论如何,它是无关紧要的,因为默认方法的全部要点是能够向现有**接口添加新方法**.我们希望能够调用list.sort()和list.forEach(). (2认同)