import org.checkerframework.checker.guieffect.qual.*;

public class Specialization {

  @PolyUIType
  public static interface I {
    @PolyUIEffect
    public void m();
  }

  public static void reqSafe(@AlwaysSafe I i) {}

  @UIEffect
  public static void reqUI(@UI I i) {}

  @PolyUIType
  public static interface Doer {

    public void doStuff(@PolyUI Doer this, @PolyUI I i);
  }

  @AlwaysSafe public static class SafeDoer implements @AlwaysSafe Doer {
    // :: error: (override.param)
    public void doStuff(@AlwaysSafe SafeDoer this, @AlwaysSafe I i) {}
  }

  public void q(@AlwaysSafe Doer doer, @UI I i) {
    doer.doStuff(i);
  }

  public static void main(String[] args) {

    @AlwaysSafe Doer d =
        new @AlwaysSafe Doer() {
          @SafeEffect
          // :: error: (override.param)
          public void doStuff(@AlwaysSafe I i) {
            reqSafe(i);
          }
        };
    @UI I ui =
        new @UI I() {
          public void m() {
            reqUI(null);
          }
        };
    Specialization q = new Specialization();
    q.q(d, ui);
  }
}
