fork(1) download
  1. interface A {
  2. void doSomethingA1();
  3. void doSomethingA2();
  4. void doSomethingA3();
  5.  
  6. interface Delegate extends A {
  7. default void doSomethingA1() { getDelegate(this).doSomethingA1(); }
  8. default void doSomethingA2() { getDelegate(this).doSomethingA2(); }
  9. default void doSomethingA3() { getDelegate(this).doSomethingA3(); }
  10. A getDelegate(A _x);
  11. }
  12. }
  13.  
  14.  
  15. interface B extends A {
  16. void doSomethingB();
  17.  
  18. interface Delegate extends B, A.Delegate {
  19. B getDelegate(B _x);
  20. default A getDelegate(A _x) { return getDelegate(this); }
  21. default void doSomethingB() { getDelegate(this).doSomethingB(); }
  22. }
  23. }
  24.  
  25.  
  26. interface C extends A {
  27. void doSomethingC();
  28.  
  29. interface Delegate extends C, A.Delegate {
  30. C getDelegate(C _x);
  31. default A getDelegate(A _x) { return getDelegate(this); }
  32. default void doSomethingC() { getDelegate(this).doSomethingC(); }
  33. }
  34. }
  35.  
  36.  
  37. interface X extends A, B, C {
  38. void doSomethingX();
  39. }
  40.  
  41.  
  42. class AImpl implements A {
  43. int x;
  44. public void doSomethingA1() { /* ... */ }
  45. public void doSomethingA2() { /* ... */ }
  46. public void doSomethingA3() { /* ... */ }
  47. }
  48.  
  49.  
  50. class BImpl implements B, A.Delegate {
  51. A a;
  52. public A getDelegate(A _x) { return a; }
  53. public void doSomethingB() { /* ... */ }
  54. }
  55.  
  56.  
  57. class CImpl implements C, A.Delegate {
  58. A a;
  59. public A getDelegate(A _x) { return a; }
  60. public void doSomethingC() { /* ... */ }
  61. }
  62.  
  63. class XImpl implements X, B.Delegate, C.Delegate {
  64. B b;
  65. C c;
  66.  
  67. public B getDelegate(B _x) { return b; }
  68. public C getDelegate(C _x) { return c; }
  69.  
  70. // приходится явно разрешить diamong problem
  71. // иначе error: class XImpl inherits unrelated defaults for getDelegate(A) from types B.Delegate and C.Delegate
  72. public A getDelegate(A _x) { return b; }
  73.  
  74. public void doSomethingX() { /* ... */ }
  75. }
  76.  
  77.  
  78. class Main {
  79. public static void main(String[] args) { }
  80.  
  81. void doIt() {
  82. X x = null; // createX(...)
  83. x.doSomethingX();
  84. x.doSomethingA1();
  85. x.doSomethingA2();
  86. x.doSomethingA3();
  87. x.doSomethingB();
  88. x.doSomethingC();
  89. }
  90. }
  91.  
Success #stdin #stdout 0.04s 4575232KB
stdin
Standard input is empty
stdout
Standard output is empty