You can give a default implementation for a method in an interface:
public interface I1 {
default void method() {
System.out.println("Test");
}
}
public interface I2 {
default void method() {
System.out.println("Oops");
}
}
When implementing both interfaces, you can choose which default implementation you want to invoke with the following syntax
public class A implements I1, I2 {
@Override
public void method() {
I1.super.method(); //or I2.super.method()
}
}
If you need to print "Test Oops" you can also call the two default implementation (and choose the order)
public class A implements I1, I2 {
@Override
public void method() {
I1.super.method();
I2.super.method();
}
}
Edit
Before Java 8 you can achieve something similar but it is far more verbose. (note that I am using some kind of decorator here)
public interface I1 {
void m1();
void m2();
void method();
}
public interface I2 {
void m3();
void m4();
void method();
}
public final class DefaultI1 implements I1 {
@Override
public void m1() {
//TODO
}
@Override
public void m2() {
//TODO
}
@Override
public void method() {
System.out.println("Test");
}
}
public final class DefaultI2 implements I2 {
@Override
public void m3() {
//TODO
}
@Override
public void m4() {
//TODO
}
@Override
public void method() {
System.out.println("Test");
}
}
public final class A implements I1, I2 {
private final I1 i1;
private final I2 i2;
public A(I1 i1, I2 i2) {
this.i1 = i1;
this.i2 = i2;
}
@Override
public void m1() {
i1.m1();
}
@Override
public void m2() {
i1.m2();
}
@Override
public void m3() {
i2.m3();
}
@Override
public void m4() {
i2.m4();
}
@Override
public void method() {
i1.method();
i2.method();
}
}
Usage
public static void main(String[] args) {
A a = new A(new DefaultI1(), new DefaultI2());
a.method(); //prints "Test Oops"
}