3

ラムダ式を使用していくつかのテストを行っていますが、コードがコンパイルされません。私のラムダ実装は間違っていますか、それとも例外処理ですか? 次のコードの正しい実装は何ですか?

class MyObject { }

interface Creatable<T> {
    T create() throws IOException;
}

/* Using the code: */
Creatable<MyObject> creator = () ->  {
    try {
        return new MyObject();
    } catch (IOException e) {
        e.printStackTrace();
    }
};

MyObject obj1 = creator.create();

try catch ブロックを削除し、メソッドでスローする例外を宣言すると、コードは正常にコンパイルおよび実行されます。

Creatable<MyObject> creator = () -> new MyObject();

コンパイルエラーは次のとおりです。

incompatible types: bad return type in lambda expression

4

3 に答える 3

6

ラムダは を返す必要がありMyObjectます。ブロックが正常に完了した場合tryはそうですが、そうでない場合はcatchブロックが実行され、何も返されません。したがって、次のように書くことができます。

Creatable<MyObject> creator = () ->  {
    try {
        return new MyObject();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
};

しかし、別のコンパイル エラーが発生します。「IOException は try ブロックでスローされません」。MyObjectしたがって、次をスローするコンストラクターも必要になりますIOException

class MyObject { MyObject() throws IOException {} }

最後に、MyObject実際に例外をスローしない限り、次を使用できます。

Creatable<MyObject> creator = () -> new MyObject();

あなたも書くことができます:

Creatable<MyObject> creator = MyObject::new;
于 2014-06-03T00:36:54.033 に答える