30

C#では、デリゲートを匿名で定義できます(ただし、それらは構文糖衣にすぎません)。たとえば、私はこれを行うことができます:

public string DoSomething(Func<string, string> someDelegate)
{
     // Do something involving someDelegate(string s)
} 

DoSomething(delegate(string s){ return s += "asd"; });
DoSomething(delegate(string s){ return s.Reverse(); });

このようなコードをJavaで渡すことは可能ですか?私は処理フレームワークを使用しています。これにはかなり古いバージョンのJavaがあります(ジェネリックはありません)。

4

6 に答える 6

61

Java 8より前:

デリゲートに最も近いJavaは、単一メソッドのインターフェースです。匿名の内部クラスを使用できます。

interface StringFunc {
   String func(String s);
}

void doSomething(StringFunc funk) {
   System.out.println(funk.func("whatever"));
}

doSomething(new StringFunc() {
      public String func(String s) {
           return s + "asd";
      }
   });


doSomething(new StringFunc() {
      public String func(String s) {
           return new StringBuffer(s).reverse().toString();
      }
   });

Java 8以降:

Java 8は、ラムダ式を言語に追加します。

    doSomething((t) -> t + "asd");
    doSomething((t) -> new StringBuilder(t).reverse().toString());
于 2009-08-27T10:43:56.953 に答える
13

これとまったく同じではありませんが、Javaには似たようなものがあります。

これは匿名内部クラスと呼ばれます。

例を挙げましょう:

DoSomething(new Runnable() {
   public void run() {
       // "delegate" body
   }
});

これはもう少し冗長で、実装するにはインターフェイスが必要ですが、それ以外はほとんど同じです。

于 2009-08-27T10:42:11.370 に答える
4

あなたの例は、匿名の内部クラスを使用して、Javaで次のようになります。

interface Func {
    String execute(String s);
}

public String doSomething(Func someDelegate) {
    // Do something involving someDelegate.execute(String s)
}

doSomething(new Func() { public String execute(String s) { return s + "asd"; } });
doSomething(new Func() { public String execute(String s) { return new StringBuilder(s).reverse().toString(); } } });
于 2009-08-27T10:48:13.340 に答える
3

このようなコードをJavaで渡すことは可能ですか?私は処理フレームワークを使用しています。これにはかなり古いバージョンのJavaがあります(ジェネリックはありません)。

質問は処理固有の回答について尋ねられたため、直接同等のものはありません。ただし、ProcessingはJava 1.4言語レベルを使用し、Java1.1では匿名の内部クラスが導入されました。これは大まかな概算です。

于 2009-08-27T10:44:53.487 に答える
3

例えば ​​:

public class Delegate
{
    interface Func
    {
        void execute(String s);
    }

    public static void doSomething(Func someDelegate) {
        someDelegate.execute("123");
    }

    public static void main(String [] args)
    {

        Func someFuncImplementation = new Func() 
        {
            @Override
            public void execute(String s) {
                System.out.println("Bla Bla :"  + s);
            }
        };

        Func someOtherFuncImplementation = new Func() 
        {
            @Override
            public void execute(String s) {
                System.out.println("Foo Bar:"  + s);
            }
        };


        doSomething(someFuncImplementation);
        doSomething(someOtherFuncImplementation);
    }
}

出力:

Bla Bla:123

Foo Bar:123

于 2015-09-11T07:44:20.617 に答える
0

ここで、C#デリゲートがスレッドセーフであることを忘れてしまいました。これらの例は、シングルスレッドアプリ専用です。

現代のアプリのほとんどはマルチスレッドの概念で書かれています。したがって、誰も答えはありません。

Javaには同等のものはありません

于 2017-08-10T02:20:45.593 に答える