Strange syntax for instantiating an inner class

constructor, inner-classes, java

Solution

Inner classes (like `Button.ClickEvent`) need a reference to an instance of the outer class (`Button`).

That syntax creates a new instance of `Button.ClickEvent` with its outer class reference set to the value of `button`.

Here's an example - ignore the lack of encapsulation etc, it's just for the purposes of demonstration:

class Outer
{
    String name;

    class Inner
    {
        void sayHi()
        {
            System.out.println("Outer name = " + name);
        }
    }
}

public class Test
{
    public static void main(String[] args)
    {
        Outer outer = new Outer();
        outer.name = "Fred";

        Outer.Inner inner = outer.new Inner();
        inner.sayHi();
    }
}

See section 8.1.3 of the spec for more about inner classes and enclosing instances.

Problem

I didn't imagine that I would encounter radically new syntax in Java anymore at this stage, but lo and behold, I just encountered something: The exact context and what the code below should do is pretty irrelevant - it's there just to give some kind of context. I'm trying to synthetically create an event in IT Mill Toolkit, so I wrote this kind of line: ``` buttonClick(new Button.ClickEvent(button)); ``` But, Eclipse gives me the following error message: No enclosing instance of type Button is accessible. Must qualify the allocation with an enclosing instance of type Button (e.g. x.new A() where x is an instance of Button). When I rewrite the line above as follows, it doesn't complain anymore: ``` buttonClick(button.new ClickEvent(button)); // button instanceof Button ``` So, my question is: What does the latter syntax mean, exactly, and why doesn't the first snippet work? What is Java complaining about, and what's it doing in the second version? Background info: Both `Button` and `Button.ClickEvent` are non-abstract public classes.

Original source