在查看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)嵌套与封闭接口有什么区别?你能举个例子吗?
谢谢。
答案 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.Dynamic
和javax.servlet.Registration.Dynamic
- 您无法提取这两个接口都是同一个包中具有相同名称的顶级接口。
除此之外,将嵌套接口提取到顶级接口没有任何区别,就像对嵌套静态类做同样的事情也不会产生影响。
我们什么时候去封闭接口?
如果你将其标记为when do we nest interfaces inside other interfaces?
答案 - 只要逻辑上有意义,问题就会更清楚。例如,如果接口X具有返回接口Y的方法,并且没有其他接口使用接口Y,则将接口Y声明为接口X的嵌套接口可能是有意义的。