2016-04-18 12 views
12

戻り値の型を持つラムダをRunnableにキャストできないのはなぜか分かりませんでしたが、非voidメソッドの参照はできません。ラムダキャスティングのルール

Runnable r1 =() -> 1; // not allowed 
// error: incompatible types: bad return type in lambda expression 
// int cannot be converted to void 

Runnable r2 = ((Supplier)() -> 1)::get; // allowed 

答えて

14

Runnableインタフェースは戻り型空隙でrun方法を定義します。ラムダ式では、矢印->に続く部分はステートメントでなければならないことを意味します。これはJLS §15.27.3で説明されています

関数型の結果が無効である場合には、ラムダ本体がステートメント式(§14.8)または無効互換のブロックのいずれかです。

JLS $14.5は、文の構文を明確に定義しています。上で説明したように、 "ExpressionStatement"(§ 14.8)でなければなりません。そこを見ると、単純なリテラルは適切な式ではないが、メソッド呼び出しは(たとえそれが何かを返すとしても)であることがわかる。

+1

JLSのどこに言及しているかを指摘してください。その場合、「矢印の後に続く部分が_statement_でなければなりません」ということになりますか?私はそれを探しています。 – Tunaki

+2

@ Tunakiそれを見つけました。[§15.27.3](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3)です。 – RealSkeptic

+1

@RealSkepticは本当に完璧です:*関数型の結果がvoidの場合、ラムダ本体はステートメント式(14.8)またはvoid互換のブロックです*とプライマリ式はステートメント式ではありません(isn 'ブロック)。 – Tunaki