0

Java で、こちらのように lua と python でファーストクラスの関数をエミュレートする方法はありますか?

def foo():
    print "foo called"
bar = foo
bar()      #output from this line is "foo called"

または、各ケースで異なるメソッドを使用して switch ステートメントを使用する唯一の方法はありますか?

編集: 明確化していただきありがとうございます。私が尋ねたいのは、関数への参照を作成し、それを関数であるかのように呼び出す方法があるということです。

また、目的は関数の特定の実装を呼び出すことではなく、呼び出す関数を選択することであり、その選択はまったく異なる可能性があります。これを行う理由は、機能を追加するために編集する必要のない、より一般的なクラスを持つためです。関数をコレクションやリストに入れるようなものです。

Edit2: 答えを見つける目的でこの質問を見ている人: これはスタックとヒープに関係しています。Java は、そのメソッドがヒープよりもはるかに厳密なスタックに格納されているため、これを行うことができません。ただし、Python はその関数をヒープに格納し、スタック上のそれらへの参照を使用します。Python では関数は参照によって呼び出されるため、関数への参照を変更して、必要に応じて使用できます。

4

3 に答える 3

0

(これを書いているときに @Óscar López が投稿したように) 関数への参照を保持し、それを値で渡します。

これを行う「Java の方法」は、インターフェースを使用することです。

インターフェース:

public interface Printer {
    public void doPrint();
}

実装:

public class FooPrinter implements Printer {
    public void doPrint() { System.out.println("foo"); }
}

(他の実装も可能です - BarPrinter、BazPrinter など)。

発信者:

Printer p = new FooPrinter();
// presumably some other code here and
// probably p is passed to another function which accepts Printer (not FooPrinter)
p.doPrint(); // outputs "foo"
于 2013-09-30T19:27:22.467 に答える
0

メソッドの参照渡しをシミュレートすることはできません。同様のものにはインターフェイスを使用しますが、オブジェクトの場合はここでシミュレートできます

于 2013-09-30T19:22:49.640 に答える