あまり知られていないJava 8の特性:汎化ターゲットタイプ推定

2271 ワード

本文はImportNew-彭秦進がjavacodegeeksから翻訳した.本文を転載する場合は、まず文章の末尾にある転載要求を参照してください.
ImportNew注:Javaテクノロジー翻訳の共有に興味がある場合は、ご参加ください. Java開発 チーム.参加方法はグループの概要を参照してください.
Java 8のプロパティリストを見ていると、ターゲットタイプ推定というとても面白い、あまり知られていないプロパティが一気に惹かれました.Java言語の設計者は、汎用的な使用時(Java 5-7)の苦痛を軽減します.過去の汎用的な使用例を見てみましょう.
class List<E> {
  static <Z> List<Z> nil() {..}
  static <Z> List<Z> cons(Z head, List<Z> tail) {..}
  E head() {..}
}
上記の例では、JEP:101において、以下の方法でよりよく表すことができると主張されている.
//     :
List.cons(42, List.nil());
String s = List.nil().head();
 
//       :
List.cons(42, List.<Integer>nil());
String s = List.<String>nil().head()
熟練したAPIデザイナーとして、Java路線図で例の進歩を見て興奮しました.これらの興奮する変化にはいったい何が含まれているのだろうか.詳しく説明させていただきます.
したがって、
//              
List<String> l = List.nil();
 
//                        
List.cons(42, List.nil());
 
//    “    ”   
String s = List.nil().head();
は、上記のチェーンメソッド呼び出しでは、付与式全体が完了するまで遅延してタイプ推定を行う.割り当て文の左側にあるコンパイラはhead()の推定を呼び出します.Stringです.そして、nil()呼び出しがStringであることを再推定する.私から見ればこれは本当に不思議だ.nil()メソッドのAST計算は、「関連」サブノード計算に遅延して最終的に完了します.これは素晴らしいアイデアですね.
はい、確かに素晴らしいです!
あなたもそう思うかもしれません.流暢なAPIのセットのため、 jooq あるいは、Stream APIは、このような呼び出しのスムーズ性を考慮して設計され、チェーン呼び出しの最後にタイプ推定が行われる.このため、最新のJDK 8評価バージョンテストの次のプログラムをダウンロードしました.
public class InferenceTest {
    public static void main(String[] args) {
        List<String> ls = List.nil();
        List.cons(42, List.nil());
        String s = List.nil().head();
    }
}
以下は、得られたコンパイル結果である.
C:\Users\Lukas\java8>javac InferenceTest.java
InferenceTest.java:5: error: incompatible types:
    Object cannot be converted to String
        String s = List.nil().head();
                                  ^
1 error
結果から、このメソッドパラメータに基づくタイプ推定はすでに実現されている(したがってコンパイルは通過している)が、チェーンメソッド呼び出しにおけるタイプ推定はまだ実現されていないことがわかる.Stack OverFlowの問題からlambda-dev開発者のメールリストにリンクする説明をネットで検索しました.
Javaタイプのシステムはかなり複雑になっているようです.複雑すぎるため、このようなクレイジーなタイプの推定を実現するのは現実的ではない.しかし、Java 8コードを毎日作成する場合、多少改善しても大きな価値があります.
最後に、Java 9でvalやvarのようなキーワードが他の言語と同じになることを願っています.
原文リンク:javacodegeeks翻訳:ImportNew.com-彭秦進
翻訳リンク:http://www.importnew.com/8301.html
[
転載は原文の出典、訳者、訳文のリンクを残してください.