2016-11-15 20 views
1

を匿名クラスの外側のインスタンスを参照してください。内部の匿名クラスから次のスニペットで

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

は、内部の匿名クラスから匿名クラスの外側のインスタンスを参照する方法はありますか?

2番目のエラーは、ここで見つけた解決策です。Keyword for the outer class from an anonymous inner class。問題はいくつかの概念と問題空間を共有しているように見えますが、性質は異なります。

答えて

0

この問題は、囲みの参照をキャプチャする新しいフィールドを定義することで修正できます

//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); 
      }; 
     }; 
    } 
}; 
関連する問題