IntelliJはインテリジェントではありませんし、私を混乱させるか、Javaの変数のスコープ(またはOOPの概念)について私が見逃している可能性があります。ラムダを無名関数として作成したスレッドのRunnableに変数を渡すには?
public class SomeClass {
private String foo = "something";
public void someMethod() {
new Thread(() -> {
String bar = foo; // How can foo be accessed from here?
someOtherMethod(); // Even for this IntelliJ shows no error.
}).start();
}
public void someOtherMethod() {
// ...
}
}
私はそれは私が達成しようとしているものをかなりよく示して考える:私は、コードのこの部分を持っている私は、そのスレッド内の工assのfooプロパティで作業したいと思います。だから私はちょうどこのような私のプログラムを書くようになってから、それは正しいのではないことに気がつきましたが、エディタがスレッドの内部からアクセスできないfooとsomeOtherMethodについて不平を言っていないことにかなり驚いていました実行可能ファイル。
多分私はOOPを完全に理解していないのです。このコードは本当に正しいですか?ちょうどfooが無名関数に値渡しされ、someOtherMethodが参照渡しされていますか?
コンパイルしますか?それは実行されますか?それはあなたが期待することをしていますか?答えがイエスならば、それは正しいです。だからそれを試してみてください。 Lambdasは、内部クラスのように、その囲むクラスのメンバーにアクセスできます。 –