Java 8中的接口默认方法
时间:2020-02-23 14:34:50 来源:igfitidea点击:
在本教程中,我将在Java 8中引入的接口中引入默认方法。
当我们创建一个接口时,我们是否面临过这种情况,并且许多类实现该接口。
现在我们需要将新方法添加到接口。
添加新方法后,Java项目将充满编译错误,因为我们需要将这些新方法添加到实现该接口的所有类(如果类实现接口,则必须在类中实现其所有方法)
让我们举个例子:创建一个名为Dootable的接口
public interface Decorable { void decorateWithCurtains(); }
现在创建一个名为room的类,它将实现此接口。
public class Room implements Decorable{ public void decorateWithCurtains() { System.out.println("Decorate room with Curtains"); } }
现在这是我们当前的实现,现在我们有一种新的装饰方式,我们希望将其添加到"装饰Inteface"。
当我们将此方法添加到装饰接口时
public interface Decorable { void decorateWithCurtains(); void decorateWithPaints(); }
如果我们使用默认方法怎么办:
public interface Decorable { void decorateWithCurtains(); default void decorateWithPaints() { System.out.println("Decorate using paints"); } }
正如我们所看到的,我们制作了DecorateWithPaints()默认值,我们不会在客房类中获得任何错误,因为我们在装饰接口中提供了默认实现。
为什么默认方法
oneliner为此可能是"向后兼容性"。
如果jdk修改了一个接口,那么实现这个接口的所有类都将破裂。
为了在Java 8中添加Lambda表达式,JDK需要将方法(例如Foreach)添加到列表或者集合接口,但如果将此方法添加到这些接口,则将百万代码作为实现接口的类别,需要实施所有方法。
通过在接口中添加默认方法,我们可以在不影响实现类的情况下提供默认实现,因为它包括该方法的实现以及需要该方法可以覆盖它的任何实现类。
多重继承怎么样?
将默认实现添加到接口可能会导致多重继承中的模糊性。
由于两个接口可以提供相同的默认方法,并且在调用时可能存在歧义。
当出现这种情况时,Calling.java 8将为我们编译时异常。
public interface Decorable { default void decorateWithPaints() { System.out.println("Decorate using paints"); } } public interface Paintable { default void decorateWithPaints() { System.out.println("Decorate using paints"); } } public class Room implements Decorable,Paintable{ }
我们可以通过在 Room类 中覆盖Decoratewithpaints方法来解决此编译错误
public class Room implements Decorable,Paintable{ public void decorateWithPaints() { System.out.println("Decorate using paints"); } }