首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的封装/嵌套接口

Java中的封装/嵌套接口
EN

Stack Overflow用户
提问于 2016-07-20 11:01:48
回答 2查看 848关注 0票数 0

在查看javax.servlet.ServletRegistration接口的代码时,我遇到了一个封装接口(在Java中的概念),即“接口动态扩展ServletRegistration,Registration.Dynamic”是ServletRegistration接口的封装接口。

我不清楚以下几点关于用Java封装接口的问题

你能帮忙吗?

(1)它们与编写两个单独/单独的文件/接口有何不同,如下所示?

Java类文件1:

代码语言:javascript
复制
interface ServletRegistration {
  m1();
  m2();
}

Java类文件2:

代码语言:javascript
复制
interface interface Dynamic extends ServletRegistration, Registration.Dynamic {
  m3();
  m4();
}

这和附件有什么不同?

(2)在上面的例子中,实现ServletRegistration接口的人是否也需要实现封装接口(接口动态)方法?

(3)我们什么时候才能把接口封装起来?到目前为止,我还没有在我的任何项目中使用过它们。

(4)嵌套与封闭界面的区别是什么?你能举个例子吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-20 11:13:55

在我看来你把条件搞混了。Dynamic不是“ServletRegistration接口的封闭接口”,它是嵌套在ServletRegistration中的。你可以说ServletRegistration正在封装ServletRegistration.Dynamic

嵌套接口类似于嵌套的静态类。它可以独立于嵌套在其中的接口来实现。

在您的示例中,嵌套Dynamic接口允许在同一个包中定义两个不同的Dynamic接口-- javax.servlet.ServletRegistration.Dynamicjavax.servlet.Registration.Dynamic --您不能将这两个接口提取为相同名称的包中的顶级接口。

除此之外,将嵌套的接口提取到顶级接口没有什么区别,就像对嵌套的静态类做同样的操作一样,没有什么区别。

我们什么时候才能把接口封装起来?

如果你用“when do we nest interfaces inside other interfaces?”这个词来表达答案,那么问题就会更清楚--只要它合乎逻辑。例如,如果接口X有返回接口Y的方法,而其他接口没有使用接口Y,那么将接口Y声明为接口X的嵌套接口可能是有意义的。

票数 1
EN

Stack Overflow用户

发布于 2016-07-20 11:04:47

interface Dynamic extends ServletRegistration, Registration.Dynamic意味着接口Dynamic扩展了其他两个接口,也就是说,就像两者的组合。任何隐式实现Dynamic的非抽象类都必须实现ServletRegistrationRegistration.Dynamic,而其他类只能实现这两个类中的一个。

它们与编写两个独立/单独的接口有何不同?

区别在于,如果一个类实现了Dynamic,那么您知道它也实现了另外两个接口,而如果单独使用它们,就不会实现它们。

在上面的例子中,任何实现ServletRegistration接口的人都需要实现封闭接口(接口动态)方法吗?

不,如果一个类只是实现了ServletRegistration,它就不必实现Dynamic。如果您切换,即如果类实现Dynamic必须是抽象的或实现ServletRegistration的(尽管这是隐式的)。

我们什么时候才能把接口封装起来?到目前为止,我还没有在我的任何项目中使用过它们。

我不确定你在这里使用的术语“附件”是否正确,所以我不能对此发表评论(我怀疑你要么把它和其他东西混在一起,要么正在应用一个非Java术语)。但是,由于您似乎是指扩展接口B和C(即interface A extends B,C)的接口A,我将尝试回答:

通常,您希望将接口解耦,即您想要处理接口B或C的实现,但是,在某些情况下,您可能希望确保您使用的类同时实现(例如,如果一个方法必须调用在B和C中声明的方法),以便您可以声明另一个将两者结合在一起的接口(例如接口A),并要求参数来实现这一点。

通过引入泛型,您可以使用像T extends B & C这样的工具来确保这一点,但是与接口相比,这是一个较新的添加,而遗留/非泛型代码不会使用这种方法。此外,如果要添加其他方法并希望强制实现其他接口,则可能必须声明组合接口。(当然,在许多情况下,您可以使用像<T extends A & B & C>这样的泛型,但是如果经常使用或者使用更多的接口,这可能会使事情变得更加复杂)。

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

https://stackoverflow.com/questions/38479455

复制
相关文章

相似问题

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