2017-12-08 4 views
0

匿名オブジェクトを作成してどこかに格納するメソッドがあるとします。この匿名オブジェクトは、パラメータとして渡されたメソッド内のlambdaを呼び出します。ラムダから匿名クラスの他のメソッドにパラメータとして渡された

public class myCallBackManager { 

    private List<MyCallBack<?>> callBackList = new LinkedList<MyCallBack<?>>(); 

    public <T> void addCallBack(Consumer<MyCallBack<T> onCall, Runnable something){ 
     callBackList.add(new MyCallback<T>() { 
      @Override 
      protected void call(MyCallback<T> callback) { 
       onCall.accept(callback); 
      } 
      @Override 
      protected void doSomething() { 
       something.run()); 
      } 
     } 
    } 

    public void runAll() { 
     for (MyCallback<?> myCallback : callBackList) { 
      myCallback.call(); 
     } 
    } 
} 

これはオブジェクトを内部的に保存し、後ですべてを実行するように要求します。

しかし、その後、私はこれを追加する:

ここ
public static void main(String[] args) { 

    Runnable someRunnable =() -> System.out.println("Doing something"); 

    MyCallBackManager myCallBackManager = new MyCallbackManager(); 
    myCallBackManager.<SomeObject> addCallback(
      (callback) -> { 
       doSomething(); // WON'T WORK 
       System.out.println(callback.toString()); 
      }, 
      someRunnable 
    }; 

    myCallBackManager.runAll(); 

} 

、私はそれがあるとして、それは無名関数の呼び出し()によって実行されるようonCallラムダからのdoSomething()を呼び出すようにしようとしていますと呼ばれる。問題は、これが起こる場所にまだ存在しないオブジェクトにはハンドルがないことです。そのメソッドを呼び出すことはできません。ラムダからdoSomething()を呼び出す方法はありますか?

doSomething()メソッドにアクセスしようとするのではなくsomeRunnable.run()を呼び出すなどの回避策がありますが、代わりにそのメソッドを呼び出す方法を特に求めています。

+0

あなたは、あなたのコード内でいくつかの奇妙なものを持っている: 'MyCallback'と' MyCallBack'、 'MyCallBack'生タイプ、' MyCallBackManager myCallBackManager =新しいMyCallbackManagerなど; ' - どの有効じゃない。これはあなたの本当のコードですか? –

+0

@ MCEmperorいいえ、私の実際のコードはより多くのものを持っていて、関連性のあるものに物事を維持しようとしました。それはジェネリックスを使用しているので、生のタイプはありません。私はそれを編集します。また、インスタンス化のためのおっとり、良いキャッチ。 – Eth

+0

それに応じて質問を編集する必要があります。たとえば、あなたが 'MyCallback'クラスのソースを提供していないので、あなたが望むものはあまり明確ではありません。私はどういうわけか、あなたは比較的単純な仕事のために複雑なことを感じています。 –

答えて

0

これは1つの解決策です。あなたは本当に何をしようとしていますか?

import java.util.LinkedList; 
import java.util.List; 
import java.util.function.Consumer; 

public class Test { 

    public static class MyCallback<T> { 

     public void call() { 
      System.out.println("Test.MyCallback.call()");   
     } 

     protected void call(MyCallback<?> callback) { 
      System.out.println("Test.MyCallback.call(MyCallback<?>)");   
     } 

     protected void doSomething() { 
      System.out.println("Test.MyCallback.doSomething()");    
     } 

    } 

    static public class CallBackManager { 

     private List<MyCallback<?>> callBackList = new LinkedList<>(); 

     public void addCallBack(Consumer<MyCallback<?>> onCall, Runnable something){ 
      callBackList.add(new MyCallback<Object>() { 
       @Override 
       protected void call(MyCallback callback) { 
        onCall.accept(callback); 
       } 
       @Override 
       protected void doSomething() { 
        something.run(); 
       } 
      } 
        ); 
     } 

     public void runAll() { 
      for (MyCallback<?> myCallback : callBackList) { 
       myCallback.call(); 
      } 
     } 
    } 

    public static void main(String[] args) { 

     Runnable someRunnable =() -> System.out.println("Doing something"); 

     CallBackManager myCallBackManager = new CallBackManager(); 
     myCallBackManager.addCallBack(
       (MyCallback<?> callback) -> { 
        callback.doSomething(); // WON'T WORK 
        System.out.println(callback.toString()); 
       }, 
       someRunnable 
       ); 

     myCallBackManager.runAll(); 

    } 

} 

あなたは多分それも問題であるTest.CallBackManager.addCallBackでonCall(消費者>、Runnableを)を使用することはありません。

それとも、これをしようとしている。

import java.util.LinkedList; 
import java.util.List; 
import java.util.function.Consumer; 

public class Test { 

    public static class MyCallback<T> { 

     public void call() { 
      System.out.println("Test.MyCallback.call()");   
     } 

     protected void call(MyCallback<?> callback) { 
      System.out.println("Test.MyCallback.call(MyCallback<?>)");   
     } 

     protected void doSomething() { 
      System.out.println("Test.MyCallback.doSomething()");    
     } 

     @Override 
     public String toString() { 
      System.out.println("Test.MyCallback.toString()");   
      return "[CLASS Test.MyCallback<T>]"; 
     } 

    } 

    static public class CallBackManager { 

     private List<MyCallback<?>> callBackList = new LinkedList<>(); 

     public void addCallBack(Consumer<MyCallback<?>> onCall, Runnable something){ 
      callBackList.add(new MyCallback<Object>() { 
       @Override 
       protected void call(MyCallback callback) { 
        onCall.accept(callback); 
       } 
       @Override 
       protected void doSomething() { 
        something.run(); 
       } 
      } 
        ); 
     } 

     public void runAll() { 
      for (MyCallback<?> myCallback : callBackList) { 
       myCallback.call(); 
       myCallback.call(myCallback);//OR THIS? 
      } 
     } 
    } 

    public static void main(String[] args) { 

     Runnable someRunnable =() -> System.out.println("Doing something"); 

     CallBackManager myCallBackManager = new CallBackManager(); 
     myCallBackManager.addCallBack(
       (MyCallback<?> callback) -> { 
        callback.doSomething(); // WON'T WORK 
        System.out.println(callback.toString()); 
       }, 
       someRunnable 
       ); 

     myCallBackManager.runAll(); 

    } 

} 
関連する問題