[英]How to invoke an interface's default implementation of a method in an overriding implementation?
假设我有以下代码:
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再现的适当代码”。 如何从“适用于Android再现的代码”中访问“适合人形的代码”? 我可以想到三种方式,但它们都不起作用:
所以似乎没有办法在默认方法中重用代码来覆盖。 真的是这样吗?
HumanoidForm.super.reproduce();
实际上,您可以自由选择现有的实现。 让我给你一个比你更复杂的场景。 更糟糕的是,所有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");
}
}
现在,我创建了一个实现A&B的C子类:
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();
看看这个: https : //blog.idrsolutions.com/2015/01/java-8-default-methods-explained-5-minutes/
特别是它所说的“如果我们想在InterfaceA或InterfaceB中专门调用sayHi()方法之一,我们也可以这样做:”
public class MyClass implements InterfaceA, InterfaceB {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
}
@Override
public void saySomething() {
System.out.println("Hello World");
}
@Override
public void sayHi() {
InterfaceA.super.sayHi();
}
}
interface InterfaceA {
public void saySomething();
default public void sayHi() {
System.out.println("Hi from InterfaceA");
}
}
interface InterfaceB {
default public void sayHi() {
System.out.println("Hi from InterfaceB");
}
}
所以似乎没有办法在默认方法中重用代码来覆盖。 真的是这样吗?
不,您可以重用代码。 您可以轻松地测试它,您将看到以下代码的工作原理:
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");
}
}
OUTPUT:
From default interface
From implementing class
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.