/*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

public class DefaultInInterface {

  static interface I {
    default Object defaultMethod1() {
      return null;
    }

    default Object defaultMethod2() {
      return "foo";
    }
  }

  public static class A implements I {
    public void defaultCallNPE() {
      System.out.println(this.defaultMethod1().toString());
    }

    public void defaultCallOk() {
      System.out.println(this.defaultMethod2().toString());
    }
  }

  public static class B extends A {
    public Object defaultMethod1() {
      return "foo";
    }

    public Object defaultMethod2() {
      return null;
    }

    public void overridenCallOk() {
      System.out.println(this.defaultMethod1().toString());
    }

    public void overridenCallNPE() {
      System.out.println(this.defaultMethod2().toString());
    }
  }

  static void uncertainCallMethod1NPE_latent(int i) {
    A aAorB = new A();
    if (i > 0) { // feasible path
      aAorB = new B();
    }
    System.out.println(aAorB.defaultMethod1().toString());
  }

  static void FN_uncertainCallMethod2NPE(int i) {
    A aAorB = new A();
    if (i > 0) { // feasible path
      aAorB = new B();
    }
    System.out.println(aAorB.defaultMethod2().toString());
  }
}