なぜ我々はラムダ関数内で直接)(スレッド#睡眠を呼び出すことはできませんか?

チャンドラブハン・シン:

以下のコードは、私のコンパイル時のエラーを与えています。

Thread t2 = new Thread(() -> {
    try { 
        sleep(1000);
    } 
    catch (InterruptedException e) {}
});

メソッドの睡眠は(int型)タイプAのために定義されていません (Aは、私のクラス名です)。

私は匿名の内部クラスを使用するときには、何のコンパイル時のエラーはありません。

Thread t1 = new Thread(){
    public void run(){
        try {
            sleep(1000);
        } catch (InterruptedException e) {}
    }
};

以下のコードは、正常に動作します:

Thread t3 = new Thread(() -> System.out.println("In lambda"));

どのように物事は、ラムダ式本体内部の作業を行うのですか?助けてください。

多くの回答から、私はエラーを使用して解決することができることを見ることができThread.sleep(1000)、私の最初のアプローチで。誰かがラムダ式ではどのようにスコープとコンテキストの仕事私に説明することができればしかし、私は本当に感謝します。

スイーパー:

Thread.sleep静的メソッドであるThreadクラス。

あなたが呼び出すことができる理由はsleep、あなたが継承するクラスのコンテキスト内で実際にあるため、匿名クラスのいずれかの修飾子なしで直接ですThreadそのため、sleepアクセスがあります。

しかし、ラムダ場合には、あなたが継承するクラスではありませんThreadあなたは、そのコードを取り巻くされているもの、クラスの中にあります。そのため、sleep直接呼び出され、あなたが言う必要がすることはできませんThread.sleepドキュメントには、また、これをサポートしています。

ラムダ式はレキシカルスコープされています。彼らはスーパータイプから任意の名前を継承するか、スコープの新しいレベルを導入していないことをこれが意味。ラムダ式の宣言は、それらが囲む環境にいるだけであると解釈されています。

基本的にあなたがラムダの外であるかのようにラムダの内側に、あなたは同じスコープ内に実際にあると言っています。あなたはアクセスできない場合はsleep、ラムダの外側を、あなたが内側にいないことができます。

また、ノートあなたがここに示されているスレッドを作成するための二つの方法、それは本質的に異なっています。ラムダ1で、あなたが渡しているRunnableThread匿名クラス1で、作成しているのに対し、コンストラクタThread直接の匿名クラスを作成することによって。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=37618&siteId=1