Search code examples
javastaticambiguousnon-static

Ambiguous call from static context in Java


The main method tries to access var, but results in ambiguous call. Why? Instance variable var in Base1 isn't accessible (visible?) from static context anyway.

  class Base1 {
      int var;
  }

  interface Base2 {
      public static final int var = 0;
  }

  class Test extends Base1 implements Base2 { 
      public static void main(String args[]) {
          System.out.println("var:" + var); 
      }
  }

Solution

  • The JLS rule for field access ambiguity is

    If the identifier names several accessible (§6.6) member fields in type T, then the field access is ambiguous and a compile-time error occurs.

    And on the subject of accessibility

    A member (class, interface, field, or method) of a reference type, or a constructor of a class type, is accessible only if the type is accessible and the member or constructor is declared to permit access:

    It doesn't make a distinction about whether the instance field access would cause a compile error in a static context.

    Note that you could have had

    public static void main(String args[]) {
        Test test = new Test();
        System.out.println("var:" + test.var); 
    }
    

    You'd still have the ambiguity.