首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Java允许实现不同的接口,每个接口都包含一个具有相同签名的方法?

为什么Java允许实现不同的接口,每个接口都包含一个具有相同签名的方法?
EN

Software Engineering用户
提问于 2012-11-28 03:29:36
回答 5查看 8.3K关注 0票数 7

我最近发现,我可以有两个接口,一个包含与另一个接口中的方法具有相同签名的方法。我可以有一个接口或类来实现上述两个接口。因此,子类/接口隐式地实现两个不同的方法作为一个方法。

为什么Java允许这样做?

因此,我可以看到很多问题。例如,Eclipse只能找到一个接口方法的实现,而对于第二个接口方法,它根本不显示任何实现。此外,我认为自动重构可能会出现问题,比如当您想在其中一个接口中更改方法的签名时,IDE将无法在所有实现中正确地更改该签名(因为它们实现了两个不同的接口,而且IDE无法判断实现引用的是哪个接口方法)。

为什么不做一个像‘接口,方法名称,冲突’之类的编译器错误呢?

EN

回答 5

Software Engineering用户

回答已采纳

发布于 2012-11-28 03:52:34

没有理由禁止这样做。接口的唯一要点是确保每个实现类中都存在具有特定签名的方法。任何实现类都可以满足这一点,即使条件被提出了两次。

当然,当您编写接口时,您可能会期望调用方法的操作具有一定的意义,并且您可能会将其记录在接口中的声明之上,但这并不是编译器所关心的。它不能检查实现类是否做正确的事情,只能检查它是否准确地复制签名。问:“为什么编译器不禁止一个方法来满足两个接口声明?”归结为“为什么编译器不阻止我在实现接口时实现错误的语义?”,这个问题的答案更容易理解:因为它不能!(如果编译器能够判断您的方法实现,如果它包含错误,则禁止它,那么我们一开始就不需要程序员,我们只需要规范和编译器。)

显然,我们希望实现一个接口能够保证实现类做正确的事情,但这不是接口可以为您所做的事情。事实上,我认为在编译器中添加一个特性可能会给人留下这样的印象是不好的!

票数 23
EN

Software Engineering用户

发布于 2012-11-28 03:50:23

为什么这会是件坏事?

仅仅因为它使Java中的重构变得更加困难,并不意味着它是坏的。例如,如果我想在C++中进行重构,那么在某些依赖于模板的代码中,这几乎是不可能的,因为模板是图灵全的。在C++中,模板就像语言中最好的东西。我们应该删除它们以使重构更容易吗?

语言设计的主要关注点应该是语言使用户的生活/工作更容易。我认为你的规则太狭窄了,不直观。

此外,这让我觉得太严格了:假设我使用的是两个库,即封闭源代码(无论如何,在Java中都是尽可能多的)。我有一个类需要实现两个接口,一个来自每个库。但是接口有一个名称/签名相同的方法。

按照你的逻辑,我注定要死!想想看,库设计人员没有做错什么:他们的工作是知道所有其他库的所有类中的所有方法名吗?没有机会确保这一点,即使你努力.

您可能会说这应该被分成两个类,但是如果库设计人员实际上对这两个方法的意思是相同的呢?在这种情况下,拥有一个类实现两个接口是正确的方法。

票数 6
EN

Software Engineering用户

发布于 2012-11-28 03:51:15

从语言的角度来看,从技术上讲,这是没有错的。如果您继承了两个类(基类是在其中实现的),就会出现问题。

如果您认为这是一个设计问题,其中一个接口对该方法有一个约定,而另一个接口有另一个契约,那么不允许它解决这个问题是不可能的。最终的解决方案将是不允许多重继承。

关于自动重构问题,IDE有一个问题(Intellij有相同的行为);它应该问您希望重构哪个基方法。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/177501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档