随着Java8';s接口是Java中现在可以使用的类适配器

随着Java8';s接口是Java中现在可以使用的类适配器,java,design-patterns,java-8,Java,Design Patterns,Java 8,类适配器upil现在被认为在java中是不可能的。对于同样的事情也这么说 但是,Java8现在支持接口中的默认方法,一个类可以实现多个接口。 因此,从具有多个默认方法的多个接口继承的类可以使一个接口的默认方法充当适配器,并调用另一个接口(适配器)的默认方法 那么,现在Java 8支持类适配器的语句是否正确呢?据我所知,类适配器模式是关于创建一个扩展多个类型的类,以便它继承至少一个实现和至少一个以前未由该实现直接实现的接口,从而允许通过接口使用现有实现 这在Java中是可能的,但有一个限制,即适配

类适配器upil现在被认为在java中是不可能的。对于同样的事情也这么说

但是,Java8现在支持接口中的默认方法,一个类可以实现多个接口。 因此,从具有多个默认方法的多个接口继承的类可以使一个接口的默认方法充当适配器,并调用另一个接口(适配器)的默认方法


那么,现在Java 8支持类适配器的语句是否正确呢?

据我所知,类适配器模式是关于创建一个扩展多个类型的类,以便它继承至少一个实现和至少一个以前未由该实现直接实现的接口,从而允许通过接口使用现有实现

这在Java中是可能的,但有一个限制,即适配器只能继承一个实现(
),但可以继承多个
接口
s()。这一限制没有任何改变。您仍然只能从一个
类继承

接口
s现在可以有
默认
方法,这是正确的,但这不会改变
接口
抽象
性质,也不会使它们有资格在概念上承载实现

即使
接口
只包含
默认
方法(无
抽象
方法),如果不创建实现
接口的新
,也无法实例化它。这样一个奇怪的
接口
只能主要用于支持适配器类的创建,这样就不再是类适配器模式的示例,因为该模式是关于组合以前不相关的类型,而不是主要为组合而设计的类型

换句话说,在实践中,当您遇到要在一个适配器中组合的多个实现类时,仍然会遇到多个不能通过继承组合的
e,并且
默认
方法特性的存在不会改变这一点


所以底线是,在Java8之前,这个模式只能与限制一起使用,而这些限制仍然适用于Java8。如果您想将这些限制视为“不可能”,那么它仍然是不可能的…

我试图找出类适配器应该是什么,以及为什么Java不可能实现它,但失败了。据我所知,类适配器应该继承一个实现和一个接口,当实现是
而接口是
接口
时,这在Java中一直是可能的。那么障碍是什么呢?我在任何地方都没有发现这样的限制,即目标不能是
抽象的
。否则,你自己回答你的问题。如果存在这样的限制,这种模式仍然是不可能的,因为
接口
s始终是
抽象的
,没有任何例外。拥有
默认
方法不会改变
接口的
抽象
性质
sIf如果目标已经实现了该方法,那么创建适配器就毫无意义了。你可以用这个靶子。只有当目标包含至少一个被适配器包含实现的
abstract
方法,并且理想情况下适配器通过纯粹扩展这两种类型(无需添加代码)来匹配这两种方法时,这才有意义。抱歉,我无法理解您的示例。在RMI中,目标类不实现RMI逻辑,也不继承它。这一切都是通过授权来实现的。因此,在适配器中没有可以覆盖的RMI方法。即使有,也不清楚如果重写适配器必须显式调用它,为什么它需要继承实现RESTful客户端。好的,一旦我们意识到您只是交换了目标和适配器角色,它就可以工作了。由于RMI接口是一个
接口
,因此您可以轻松创建一个适配器类,该类实现远程
接口
,并扩展RESTful客户端实现
。这是一个很好的证明,它实际上在Java中工作……在上面的回答中,我们一方面使用实现,另一方面使用接口。我们正在实现该接口以使适配器工作……让我再举一个例子——假设我们使用JPA和供应商适配器来休眠。JPA的实现只是委托给hibernate的供应商适配器,后者执行hibernate代码。现在JPA已经有了一个实现,然后是供应商适配器,然后是hibernate实现。因此,我们有两个实现,中间有一个适配器。如果我试图在上面的回答中说明这一点,那么hibernate代码必须在供应商适配器本身中编写。但事实并非如此。适配器只是一个适配器,它连接两个实现-它不实现任何一方。适配器连接两个实现,但您要求使用一种特定类型的适配器,它通过继承创建连接,这种适配器只有在继承有任何影响时才有用,即重写或实现方法。然而,答案的关键是,无论你如何判断,情况并没有改变。这应该能回答你的问题。