匿名オブジェクトを作成してどこかに格納するメソッドがあるとします。この匿名オブジェクトは、パラメータとして渡されたメソッド内の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()を呼び出すなどの回避策がありますが、代わりにそのメソッドを呼び出す方法を特に求めています。
あなたは、あなたのコード内でいくつかの奇妙なものを持っている: 'MyCallback'と' MyCallBack'、 'MyCallBack'生タイプ、' MyCallBackManager myCallBackManager =新しいMyCallbackManagerなど; ' - どの有効じゃない。これはあなたの本当のコードですか? –
@ MCEmperorいいえ、私の実際のコードはより多くのものを持っていて、関連性のあるものに物事を維持しようとしました。それはジェネリックスを使用しているので、生のタイプはありません。私はそれを編集します。また、インスタンス化のためのおっとり、良いキャッチ。 – Eth
それに応じて質問を編集する必要があります。たとえば、あなたが 'MyCallback'クラスのソースを提供していないので、あなたが望むものはあまり明確ではありません。私はどういうわけか、あなたは比較的単純な仕事のために複雑なことを感じています。 –