Ambiguous call from static context in Java

ambiguous, java, non-static, static

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.

Problem

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); } } ```

Original source