2017-03-26 8 views

答えて

1

私はFunctionN型がインスタンス化されるため、関数によってあなたは無名関数を意味すると仮定しています。

functionNのapplyメソッドは、ドキュメントごとに "この関数の本体を引数に適用する"関数の引数で呼び出されます。

object Main { 

    def main(args: Array[String]): Unit = { 

    def anonFun = (x: Int) => x 

    anonFun(5) 
    } 
} 

あなたが生成されたバイトコードを見ると次のように表示されます:

はこの考えてみましょう

INVOKESPECIAL com/mf/Main$.anonFun$1()Lscala/Function1; 
ICONST_5 
INVOKEINTERFACE scala/Function1.apply$mcII$sp (I)I 

INVOKESPECIALが、その後一定の5がロードされ、無名関数をロードし、 Function1のapplyメソッドが定数と共に呼び出されます。

+0

これは2.11または2.12ですか?どういうわけか、新しいJava8-lambda互換エンコーディングで2.12と違って見えるはずでした。 –

+0

@JörgWMittag2.11で実行しましたが、2.12では私が提示したバイトコードは同じです。違いは2.11です。anonFun $ 1が定義されている新しい匿名クラスが作成されますが、2.12では、Java8のINVOKEDYNAMICがラムダ式の作成に使用されます。つまり、anon関数が呼び出される実際のセクションではなく、異なっています。 –

+0

情報をありがとう! –

関連する問題