Instantiate interface in JAVA?

2019-07-15 10:17发布

问题:

I'm reading the docs on the UIBinder of GWT and the first code snippet made me confused:

public class HelloWorld extends UIObject { // Could extend Widget instead
  interface MyUiBinder extends UiBinder<DivElement, HelloWorld> {}
  private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

  @UiField SpanElement nameSpan;

  public HelloWorld() {
    // createAndBindUi initializes this.nameSpan
    setElement(uiBinder.createAndBindUi(this));
  }
}

On the second line an interface is created locally which extends the UiBinder interface. However, on the third line an instance of this interface is created using GWT.create().

How is this possible? There's nowhere a class that implements MyUiBinder, so it can't be instantiated, right?

回答1:

GWT.create is treated specially by the GWT Java compiler at compile time. The GWT class is the place where Google puts the low-level "magic" that makes GWT work.

More details under this question.



回答2:

Here is a rather old answer (old in SO terms ;) ) that covers the same topic.

As far as I understand: it does not work magically but with the little help of a generator that knows how to create an instance for a given interface (some MyUIBinderGenerator in your example). And that generator has to be implemented and published in some gwt.xml file.