interface A {
void doSomethingA1();
void doSomethingA2();
void doSomethingA3();
default void doSomethingA1() { getDelegate(this).doSomethingA1(); }
default void doSomethingA2() { getDelegate(this).doSomethingA2(); }
default void doSomethingA3() { getDelegate(this).doSomethingA3(); }
A getDelegate(A _x);
}
}
interface B extends A {
void doSomethingB();
B getDelegate(B _x);
default A getDelegate(A _x) { return getDelegate(this); }
default void doSomethingB() { getDelegate(this).doSomethingB(); }
}
}
interface C extends A {
void doSomethingC();
C getDelegate(C _x);
default A getDelegate(A _x) { return getDelegate(this); }
default void doSomethingC() { getDelegate(this).doSomethingC(); }
}
}
interface X extends A, B, C {
void doSomethingX();
}
class AImpl implements A {
int x;
public void doSomethingA1() { /* ... */ }
public void doSomethingA2() { /* ... */ }
public void doSomethingA3() { /* ... */ }
}
A a;
public A getDelegate(A _x) { return a; }
public void doSomethingB() { /* ... */ }
}
A a;
public A getDelegate(A _x) { return a; }
public void doSomethingC() { /* ... */ }
}
B b;
C c;
public B getDelegate(B _x) { return b; }
public C getDelegate(C _x) { return c; }
// приходится явно разрешить diamong problem
// иначе error: class XImpl inherits unrelated defaults for getDelegate(A) from types B.Delegate and C.Delegate
public A getDelegate(A _x) { return b; }
public void doSomethingX() { /* ... */ }
}
class Main {
public static void main
(String[] args
) { }
void doIt() {
X x = null; // createX(...)
x.doSomethingX();
x.doSomethingA1();
x.doSomethingA2();
x.doSomethingA3();
x.doSomethingB();
x.doSomethingC();
}
}
aW50ZXJmYWNlIEEgewogIHZvaWQgZG9Tb21ldGhpbmdBMSgpOwogIHZvaWQgZG9Tb21ldGhpbmdBMigpOwogIHZvaWQgZG9Tb21ldGhpbmdBMygpOwogIAogIGludGVyZmFjZSBEZWxlZ2F0ZSBleHRlbmRzIEEgewogICAgZGVmYXVsdCB2b2lkIGRvU29tZXRoaW5nQTEoKSB7IGdldERlbGVnYXRlKHRoaXMpLmRvU29tZXRoaW5nQTEoKTsgfQogICAgZGVmYXVsdCB2b2lkIGRvU29tZXRoaW5nQTIoKSB7IGdldERlbGVnYXRlKHRoaXMpLmRvU29tZXRoaW5nQTIoKTsgfSAgCiAgICBkZWZhdWx0IHZvaWQgZG9Tb21ldGhpbmdBMygpIHsgZ2V0RGVsZWdhdGUodGhpcykuZG9Tb21ldGhpbmdBMygpOyB9ICAKICAgIEEgZ2V0RGVsZWdhdGUoQSBfeCk7CiAgfQp9CgoKaW50ZXJmYWNlIEIgZXh0ZW5kcyBBIHsKICB2b2lkIGRvU29tZXRoaW5nQigpOyAKICAKICBpbnRlcmZhY2UgRGVsZWdhdGUgZXh0ZW5kcyBCLCBBLkRlbGVnYXRlIHsKICAgIEIgZ2V0RGVsZWdhdGUoQiBfeCk7ICAgIAogICAgZGVmYXVsdCBBIGdldERlbGVnYXRlKEEgX3gpIHsgcmV0dXJuIGdldERlbGVnYXRlKHRoaXMpOyB9CiAgICBkZWZhdWx0IHZvaWQgZG9Tb21ldGhpbmdCKCkgeyBnZXREZWxlZ2F0ZSh0aGlzKS5kb1NvbWV0aGluZ0IoKTsgfQogIH0KfQoKCmludGVyZmFjZSBDIGV4dGVuZHMgQSB7CiAgdm9pZCBkb1NvbWV0aGluZ0MoKTsgCiAgCiAgaW50ZXJmYWNlIERlbGVnYXRlIGV4dGVuZHMgQywgQS5EZWxlZ2F0ZSB7CiAgICBDIGdldERlbGVnYXRlKEMgX3gpOyAgICAKICAgIGRlZmF1bHQgQSBnZXREZWxlZ2F0ZShBIF94KSB7IHJldHVybiBnZXREZWxlZ2F0ZSh0aGlzKTsgfQogICAgZGVmYXVsdCB2b2lkIGRvU29tZXRoaW5nQygpIHsgZ2V0RGVsZWdhdGUodGhpcykuZG9Tb21ldGhpbmdDKCk7IH0KICB9Cn0KCgppbnRlcmZhY2UgWCBleHRlbmRzIEEsIEIsIEMgewogIHZvaWQgZG9Tb21ldGhpbmdYKCk7IAp9CgogIApjbGFzcyBBSW1wbCBpbXBsZW1lbnRzIEEgeyAKICBpbnQgeDsgCiAgcHVibGljIHZvaWQgZG9Tb21ldGhpbmdBMSgpIHsgLyogLi4uICovIH0KICBwdWJsaWMgdm9pZCBkb1NvbWV0aGluZ0EyKCkgeyAvKiAuLi4gKi8gfSAgCiAgcHVibGljIHZvaWQgZG9Tb21ldGhpbmdBMygpIHsgLyogLi4uICovIH0KfQoKCmNsYXNzIEJJbXBsIGltcGxlbWVudHMgQiwgQS5EZWxlZ2F0ZSB7CiAgQSBhOwogIHB1YmxpYyBBIGdldERlbGVnYXRlKEEgX3gpIHsgcmV0dXJuIGE7IH0KICBwdWJsaWMgdm9pZCBkb1NvbWV0aGluZ0IoKSB7IC8qIC4uLiAqLyB9Cn0KCgpjbGFzcyBDSW1wbCBpbXBsZW1lbnRzIEMsIEEuRGVsZWdhdGUgewogIEEgYTsKICBwdWJsaWMgQSBnZXREZWxlZ2F0ZShBIF94KSB7IHJldHVybiBhOyB9CiAgcHVibGljIHZvaWQgZG9Tb21ldGhpbmdDKCkgeyAvKiAuLi4gKi8gfSAgCn0KCmNsYXNzIFhJbXBsIGltcGxlbWVudHMgWCwgQi5EZWxlZ2F0ZSwgQy5EZWxlZ2F0ZSB7CiAgQiBiOwogIEMgYzsKICAKICBwdWJsaWMgQiBnZXREZWxlZ2F0ZShCIF94KSB7IHJldHVybiBiOyB9CiAgcHVibGljIEMgZ2V0RGVsZWdhdGUoQyBfeCkgeyByZXR1cm4gYzsgfQogIAogIC8vINC/0YDQuNGF0L7QtNC40YLRgdGPINGP0LLQvdC+INGA0LDQt9GA0LXRiNC40YLRjCBkaWFtb25nIHByb2JsZW0KICAvLyDQuNC90LDRh9C1IGVycm9yOiBjbGFzcyBYSW1wbCBpbmhlcml0cyB1bnJlbGF0ZWQgZGVmYXVsdHMgZm9yIGdldERlbGVnYXRlKEEpIGZyb20gdHlwZXMgQi5EZWxlZ2F0ZSBhbmQgQy5EZWxlZ2F0ZQogIHB1YmxpYyBBIGdldERlbGVnYXRlKEEgX3gpIHsgcmV0dXJuIGI7IH0gIAoKICBwdWJsaWMgdm9pZCBkb1NvbWV0aGluZ1goKSB7IC8qIC4uLiAqLyB9ICAKfQoKCmNsYXNzIE1haW4gewogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsgfQogIAogIHZvaWQgZG9JdCgpIHsKICAJWCB4ID0gbnVsbDsgIC8vIGNyZWF0ZVgoLi4uKQogIAl4LmRvU29tZXRoaW5nWCgpOwogIAl4LmRvU29tZXRoaW5nQTEoKTsKICAJeC5kb1NvbWV0aGluZ0EyKCk7CiAgCXguZG9Tb21ldGhpbmdBMygpOwogIAl4LmRvU29tZXRoaW5nQigpOwogIAl4LmRvU29tZXRoaW5nQygpOyAgCQogIH0KfQo=