Ссылка на внешний экземпляр анонимного класса из внутреннего анонимного класса

В следующем фрагменте:

public void main(){
    //Enclosing scope
    final TextField field = new TextField("", uiSkin) {
        @Override
        protected InputListener createInputListener() {
            return new TextFieldClickListener() {
                @Override
                public boolean keyUp(com.badlogic.gdx.scenes.scene2d.InputEvent event, int keycode) {



                    // error1 => The local variable field may not have been initialized
                    System.out.println("Field "+field+"event="+event+" key={}"+keycode);

                    // error2 => No enclosing instance of the type TextField is accessible in scope
                    System.out.println("Field "+TextField.this+"event="+event+" key={}"+keycode);



                    return super.keyUp(event, keycode);
                };
            };
        }
    };
}

Есть ли способ ссылаться на внешний экземпляр анонимного класса из внутреннего анонимного класса?

Вторая ошибка связана с решением, которое я нашел здесь. Ключевое слово для внешнего класса от анонимного внутреннего класса. Кажется, что проблемы имеют некоторые понятия и проблемное пространство, но различны по своей природе.

1 ответ

Проблема может быть решена путем определения нового поля, которое фиксирует ссылку на это.

//Enclosing scope
final TextField field = new TextField("", uiSkin) {
    TextField this2 = this;
    @Override
    protected InputListener createInputListener() {
        return new TextFieldClickListener() {
            @Override
            public boolean keyUp(com.badlogic.gdx.scenes.scene2d.InputEvent event, int keycode) {
                System.out.println("Field "+this2+"event="+event+" key={}"+keycode);
                return super.keyUp(event, keycode);
            };
        };
    }
};
Другие вопросы по тегам