Java中的Enclosing / Nested接口

时间:2016-07-20 11:01:49

标签: java

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

我不清楚Java

中包含接口的以下几点

你能帮忙吗?

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

Java类文件1:

d3.layout.tree

Java类文件2:

var tree = d3.layout.tree();  //v3

var tree = d3.tree();  //v4

这与封闭有什么不同?

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

(3)我们什么时候去封闭接口?到目前为止,我还没有在任何项目中使用它们。

(4)嵌套与封闭接口有什么区别?你能举个例子吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

interface Dynamic extends ServletRegistration, Registration.Dynamic表示接口Dynamic扩展了其他接口,即就像两者的组合。隐式实现Dynamic的任何非抽象类也必须实现ServletRegistration Registration.Dynamic,而其他类只能实现其中一个。

  

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

不同之处在于,如果一个类实现了Dynamic,那么知道它还会实现另外两个接口,而如果你单独使用它们,那么你就不会这样做。

  

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

不,如果一个班级只是实施ServletRegistration,那么它就不必实施Dynamic。如果你切换它,即如果一个类实现Dynamic 要么是抽象的,要么实现ServletRegistration(虽然这是隐含的)。

  

我们什么时候去封闭接口?到目前为止,我还没有在任何项目中使用它们。

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

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

随着泛型的引入,您可以使用类似T extends B & C的内容来确保这一点,但与接口和传统/非泛型代码相比,这是一个更新的新增功能。此外,如果要添加其他方法并希望强制实施其他接口,则可能必须声明组合接口。 (在许多情况下,您可以使用<T extends A & B & C>之类的泛型,但如果经常使用或使用大量接口,这可能会使事情变得更复杂。

答案 1 :(得分:1)

在我看来,你混淆了这些条款。 Dynamic不是ServletRegistration接口&#34;的封闭接口,它嵌套在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的嵌套接口可能是有意义的。