假设我有以下代码:
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复制的适当代码”中访问“适当的类人形式代码”?我可以想出三种方法,但没有一种可行:
因此,似乎没有办法重复使用默认方法中的代码来重写。真的是这样吗?
发布于 2015-09-18 22:50:39
实际上,您可以自由选择现有的实现。让我给你一个比你的稍微复杂一些的场景。更糟糕的是,所有的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();发布于 2015-09-18 21:49:09
HumanoidForm.super.reproduce();发布于 2015-09-18 21:51:48
看看这个:https://blog.idrsolutions.com/2015/01/java-8-default-methods-explained-5-minutes/
特别是其中的一节说:“如果我们想在InterfaceA或InterfaceB中具体调用一个InterfaceB()方法,我们也可以这样做:”
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");
}
}https://stackoverflow.com/questions/32661521
复制相似问题