Java 如何调用接口';重写实现中方法的默认实现?
假设我有以下代码:Java 如何调用接口';重写实现中方法的默认实现?,java,default,Java,Default,假设我有以下代码: interface HumanoidForm { default HumanoidForm reproduce() { <appropriate code for humanoid form reproduction> } } class Android extends Machine implements HumanoidForm { public HumanoidForm reproduce() { &
interface HumanoidForm {
default HumanoidForm reproduce() {
<appropriate code for humanoid form reproduction>
}
}
class Android extends Machine implements HumanoidForm {
public HumanoidForm reproduce() {
<appropriate code for android reproduction> // how to use HumanoidForm's default implementation here?
}
}
界面人形{
默认类人形复制(){
}
}
类Android扩展机器实现类人表单{
公共类人型{
//这里如何使用HumanoidForm的默认实现?
}
}
现在假设“适用于android复制的代码”最好用“适用于仿人形体复制的代码”作为子程序来描述。如何从“android复制的适当代码”中访问“仿人表单的适当代码”?我可以想出三种方法,但都不管用:
- 只需调用reproduct()即可调用重写实现。
- 编写((HumanoidForm)this).repearch()仍然调用重写实现。
- 通过重写方法模拟在超类中重复使用方法的实现,人们可能会想到编写super.repearch()。然而,这指的是机器实现的复制,这甚至可能不存在。
HumanoidForm.super.reproduce();
特别是在这一节中,它说“如果我们想特别调用InterfaceA或InterfaceB中的一个sayHi()方法,我们还可以执行以下操作:”
因此,似乎没有办法在默认方法中重新使用代码进行重写。真的是这样吗
HumanoidForm.super.reproduce();
不,您可以重用代码。您可以轻松地对其进行测试,您将看到以下代码可以正常工作:
public class Test implements HumanoidForm
{
public static void main(String[] args)
{
new Test().reproduce();
}
@Override
public void reproduce(){
HumanoidForm.super.reproduce(); //Invoking default method
System.out.println("From implementing class");
}
}
interface HumanoidForm {
default void reproduce() {
System.out.println("From default interface");
}
}
输出:
From default interface
From implementing class
实际上,您可以自由选择现有的实现。让我给你一个比你的稍微复杂一点的场景。更糟糕的是,所有
A
、B
和C
都有相同的方法签名
interface A {
default void doWork() {
System.out.println("Default implementation From A");
}
}
interface B{
default void doWork() {
System.out.println("Default implementation From B");
}
}
class C{
void doWork(){
System.out.println("Default implementation From C");
}
}
现在,我为C创建了一个子类,它实现了a&B:
class Tester extends C implements A, B
{
@Override public void doWork(){
A.super.doWork(); //Invoke A's implementation
B.super.doWork(); //Invoke B's implementation
super.doWork(); //Invoke C's implementation
}
}
输出将是:
Default implementation From A
Default implementation From B
Default implementation From C
当你跑步时:
new Tester().doWork();
我只是想说,你刚刚用接口的默认实现让我大吃一惊,我不知道你可以这么做。@Jin,这是一个相对较新的功能,可从Java 8获得。