1

私はこれを理解していません:

OnGlobalLayoutListener listener = new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
         System.out.println("I am override a method");
    }

    public void hello(){
         System.out.println("This is a new method");
    }
};

//listener.hello(); Why I cannot do it?

これがなければ私はそれを行うことができます:

new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
             System.out.println("I am override a method");
        }

        public void hello(){
             System.out.println("This is a new method");
        }
    }.hello();

最初のケースではメソッドhello()を呼び出せず、2番目のケースでは呼び出すことができるのはなぜですか?

4

2 に答える 2

3

と呼ばれる新しいメソッドを使用して、新しい匿名タイプを作成していますhello

その式のタイプは新しい匿名タイプであるため、式をhello呼び出すことができます。new OnGlobalLayoutListener() { }

のコンパイル時の型はメソッドがないため、呼び出すことはできませhellolistenerlistenerOnGlobalLayoutListenerhello

メソッドを追加したい場合は、現在のクラス内に新しいネストされたクラスを作成することを個人的にお勧めします。メソッド内で新しい名前付きクラスを宣言することはできますが、それが作成する混乱の観点からはお勧めしません。

のオーバーライドはonGlobalLayout、質問とはまったく関係がないことに注意してください。書いてみても同じことがわかります。

new Object {
    public void hello() { ... }
}
于 2012-08-11T12:00:54.077 に答える
1

どちらの場合も、匿名の内部クラスを作成してオブジェクトをインスタンス化しますが、メソッドを参照するhello()方法は異なります。

OnGlobalLayoutListener 最初のケースでは、インスタンス化されたクラスをインターフェイスの参照に割り当てます。問題は、インターフェースがhello()メソッドを宣言していないため、呼び出すことができないことです。ただし、を呼び出してみても問題ありませんonGlobalLayout()

2番目のケースでは、インスタンス化されたばかりのクラスhello()を参照してメソッドを呼び出すため、メソッドにアクセスできます。インターフェイスとは対照的に、クラスには、オーバーライドされたメソッドと要求されたメソッドの2つのメソッドがあります。onGlobalLayout()hello()

于 2012-08-11T12:14:19.860 に答える