
class Test1 {
  interface A {
    void foo(String x);
  }

  interface C<T> extends A {

    default void foo(T x) { }
  }

  <error descr="Class 'D' must either be declared abstract or implement abstract method 'foo(String)' in 'A'">class D implements C<String></error> { }
  interface E extends C<String> { }
}

class Test2 {
  interface A {
    default void foo(String x) {}
  }

  interface C<T> extends A {

    void foo(T x);
  }

  <error descr="Class 'D' must either be declared abstract or implement abstract method 'foo(T)' in 'C'">class D implements C<String></error> {}
  interface E extends C<String> {}
}

class Test3 {
  interface A {
    default void foo(String x) {}
  }

  interface C<T> extends A {

    default void foo(T x) {}
  }

  class D implements C<String> { }
  interface E extends C<String> { }
}

class Test4 {
  interface A {
    void foo(String x);
  }

  interface C<T> extends A {

    void foo(T x);
  }

  abstract class D implements C<String>, A { }
  interface E extends C<String>, A {}
}

class Test5 {
  interface A {
    void foo(String x);
  }

  abstract class B implements A { }

  interface C<T> extends A {
    default void foo(T x) { }
  }

  <error descr="Class 'D' must either be declared abstract or implement abstract method 'foo(String)' in 'A'">class D extends B implements C<String></error> { }
}


class Test6 {
  interface A {
    default void foo(String s) { }
  }

  interface B extends A {}

  interface C<T> extends A {
    default void foo(T t) {}
  }
  abstract static class D implements C<String>, B { }
  static class E extends D {}
}