少し前に、Oracle は Java 8 に Closures を追加するのは良い考えだと判断しました。当初からクロージャがあった Scala と比較して、設計上の問題がどのように解決されているのだろうか。
javac.infoからの未解決の問題の引用:
関数型にメソッド ハンドルを使用できますか? それを機能させる方法は明らかではありません。1 つの問題は、メソッド ハンドルが型パラメーターを具体化することですが、関数のサブタイピングを妨げる方法です。
「スロー」型パラメーターの明示的な宣言を取り除くことはできますか? アイデアは、宣言された境界がチェックされた例外型である場合は常に分離型推論を使用することです。これは厳密な下位互換性はありませんが、実際の既存のコードを壊す可能性は低いです。ただし、構文のあいまいさのために、おそらく型引数の「スロー」を取り除くことはできません。
古いスタイルのループ インデックス変数で @Shared を許可しない
複数のメソッドを定義する Comparator などのインターフェイスを処理します。1つを除くすべてのメソッドは、Object から継承されたメソッドによって実装されます。「単一のメソッドとのインターフェース」の定義は、オブジェクトのメソッドによって実装されないメソッドのみをカウントする必要があり、それらの 1 つを実装するとそれらすべてが実装される場合は、複数のメソッドを 1 つとしてカウントする必要があります。主に、これには、インターフェースが単一の抽象メソッドのみを持つことが何を意味するかについて、より正確な仕様が必要です。
関数型からインターフェイスへのマッピングを指定します:名前、パラメーターなど。関数型からシステム生成インターフェイスへのマッピングを正確に完全に指定する必要があります。
型推論。型推論の規則は、例外型パラメータの推論に対応するために拡張する必要があります。同様に、クロージャ変換で使用されるサブタイプの関係も反映する必要があります。
例外の透明性を改善するために、例外タイプのパラメーターを削除しました。 おそらく、除外された例外タイプのパラメーターが境界を意味するようにします。これにより、java.util.concurrent.Callable など、例外の型パラメーターを持たない既存の汎用インターフェイスを、新しい汎用例外パラメーターを追加することで後付けできます。
関数型のクラス リテラルはどのように形成されますか? #void().class ですか? もしそうなら、オブジェクトタイプが消去された場合、どのように機能しますか? #?(?).class ですか?
システム クラス ローダーは、関数型インターフェイスを動的に生成する必要があります。 関数型に対応するインターフェイスは、ブートストラップ クラス ローダーによってオンデマンドで生成される必要があるため、それらをすべてのユーザー コードで共有できます。プロトタイプの場合、javac にこれらのインターフェースを生成させて、プロトタイプで生成されたコードをストック (JDK5-6) VM で実行できるようにすることができます。
ラムダ式の評価は毎回新しいオブジェクトを生成する必要がありますか? うまくいけば、そうではありません。たとえば、ラムダが外側のスコープから変数をキャプチャしない場合は、静的に割り当てることができます。同様に、他の状況では、ループ内で宣言された変数をキャプチャしない場合、ラムダを内側のループの外に移動できます。したがって、仕様がラムダ式の結果の参照同一性について何も約束しないのが最善であり、そのような最適化はコンパイラーによって実行されます。
私が理解している限り、2.、6.、および 7. は Scala では問題ではありません。Scala は、Java のようなある種の「シャドウ型システム」として Checked Exceptions を使用しないためです。
残りはどうですか?