先日の記事に宮川さんからつっこみが入りました。
http://d.hatena.ne.jp/miyakawa_taku/20140315/1394902012
ありがたいことです。やはり情報というのはどんどん公開すべきです。
リンク先を読まない人のために書いておくと、自分が書いた「Java8のラムダ式は(関数型インターフェースの)オブジェクトを生成しない」は間違いで、仕様上は「Evaluation of a lambda expression produces an instance of a functional interface」です、というつっこみです。
この記述は知りませんでした。
「an instance of a functional interface」をオブジェクトと言い換えていいかは多少迷います。オブジェクトという用語の定義次第だからです。個人的には、参照のとれる実体をオブジェクトと呼んでいいと思うので、これをオブジェクトと言い換えるのにそんなに抵抗はありません。とは言え、produce an instanceとcreate an objectを同じ日本語にするのは少し抵抗があります。
なので、昨日の記事の発言は「OpenJDK Java8のラムダ式は(関数型インターフェースの)オブジェクトをnewしない」に訂正します。newは単に対応するバイトコードのことです。用語に解釈の余地がありません。
ちなみに、「Java8のラムダ式は(関数型インターフェースの)オブジェクトを生成しない」と書いた理由のひとつは、new呼び出しのないバイトコードを見ての判断ですが、もうひとつの理由としてラムダ式の中に書いたthis参照の動きがあります。と言うのも、ラムダ式の中のthis参照はエンクロージングオブジェクトを参照するからです。この動作が、(InvokeDynamicを使うか否かの)実装依存だとまずいはずです。
仕様から探すと、「Unlike code appearing in anonymous class declarations, the meaning of names and the this and super keywords appearing in a lambda body are the same as in the surrounding context (except that lambda parameters introduce new names).」が該当するようです。
最近のコメント