在查看javax.servlet.ServletRegistration接口的代码时,我遇到了一个封装接口(在Java中的概念),即“接口动态扩展ServletRegistration,Registration.Dynamic”是ServletRegistration接口的封装接口。
我不清楚以下几点关于用Java封装接口的问题
你能帮忙吗?
(1)它们与编写两个单独/单独的文件/接口有何不同,如下所示?
Java类文件1:
interface ServletRegistration {
m1();
m2();
}Java类文件2:
interface interface Dynamic extends ServletRegistration, Registration.Dynamic {
m3();
m4();
}这和附件有什么不同?
(2)在上面的例子中,实现ServletRegistration接口的人是否也需要实现封装接口(接口动态)方法?
(3)我们什么时候才能把接口封装起来?到目前为止,我还没有在我的任何项目中使用过它们。
(4)嵌套与封闭界面的区别是什么?你能举个例子吗?
谢谢。
发布于 2016-07-20 11:13:55
在我看来你把条件搞混了。Dynamic不是“ServletRegistration接口的封闭接口”,它是嵌套在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的嵌套接口可能是有意义的。
发布于 2016-07-20 11:04:47
interface Dynamic extends ServletRegistration, Registration.Dynamic意味着接口Dynamic扩展了其他两个接口,也就是说,就像两者的组合。任何隐式实现Dynamic的非抽象类都必须实现ServletRegistration和Registration.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>这样的泛型,但是如果经常使用或者使用更多的接口,这可能会使事情变得更加复杂)。
https://stackoverflow.com/questions/38479455
复制相似问题