Java 8の新しい特性の汎用的なターゲットタイプ推定_ダイナミックノードJavaアカデミー整理

2859 ワード

汎用性の単純な理解
汎用型はJava SE 1.5の新しい特性であり、汎用型の本質はパラメトリック型であり、つまり動作するデータ型は1つのパラメータとして指定される.一般的なポイントは「タイプの変数」です.このタイプの変数は、クラス、インタフェース、およびメソッドの作成に使用できます.
Java汎用を理解する最も簡単な方法は、Javaタイプ変換(casting)の操作を節約する便利な文法と見なすことです.

List box = new ArrayList();
box.add(new Apple());Apple apple =box.get(0);

上記のコード自体は明らかです.boxはAppleオブジェクトが入ったリストです.getメソッドは、タイプ変換を必要としないAppleオブジェクトインスタンスを返します.汎用型はありません.上のコードはこのように書く必要があります.

Apple apple = (Apple)box.get(0);

汎用的な気まずい
汎用型の最大の利点は、プログラムのタイプセキュリティを提供し、後方互換性を提供することですが、定義するたびに汎用型のタイプを明記するという気まずい点もあります.このように、指定が冗長であるだけでなく、多くのプログラマーが汎用型に慣れていないため、正確なタイプパラメータを与えることができない場合が多いです.コンパイラにより汎用的なパラメータタイプを自動的に推定することで,このような状況を低減し,コードの可読性を向上させることができるようになった.
JAva 7の汎用タイプ推定の改善
以前のバージョンでは汎用タイプを使用していましたが、宣言して値を割り当てる必要がある場合は、両側に汎用タイプを追加します.例:

Map myMap = new HashMap();

老子は変数を宣言するときにパラメータタイプを指定し、毛のためにオブジェクトを初期化するときに指定すると思いますか?幸いなことに、Java SE 7では、この方法が改善され、次の文を使用して宣言し、値を割り当てることができます.

Map myMap = new HashMap<>(); //     "<>"

この文では、コンパイラは、変数宣言時の汎用タイプに基づいて、HashMapのインスタンス化時の汎用タイプを自動的に推定します.また、new HashMapの後にある「<>」に注意してください.この「<>」を加えると自動タイプ推定であることを示します.そうしないと、非汎用タイプのHashMapであり、コンパイラを使用してソースコードをコンパイルする際に警告メッセージが表示されます.
ただし、Java SE 7は、汎用インスタンスを作成する際のタイプ推定には制限があります.コンストラクタのパラメータ化タイプがコンテキストで顕著に宣言されている場合にのみ、タイプ推定を使用できます.そうしないとできません.たとえば、次の例はjava 7で正しくコンパイルできません(ただし、メソッドパラメータに基づいて汎用タイプを自動的に推定するため、java 8でコンパイルできます):

List list = new ArrayList<>();
list.add("A");//   addAll    Collection extends String>     ,           
list.addAll(new ArrayList<>());

Java 8の汎用タイプ推定の改善
JAva 8における汎用型のターゲットタイプ推定は主に2つ:
1.メソッドコンテキストによる汎用ターゲットタイプの推定をサポート
2.メソッド呼び出しリンクにおいて、汎用型推定が最後のメソッドに伝達されることをサポートする
公式サイトの例を見てみましょう

class List {
  static  List nil() { ... };
  static  List cons(Z head, List tail) { ... };
  E head() { ... }
}

   JEP 101の特性によると、上記の方法を呼び出すときにこのように書くことができます.

//                     
List l = List.nil();
//          
//List l = List.nil();
//                 
List.cons(42, List.nil());
//          
//List.cons(42, List.nil());

まとめ
以上がJEP 101の特性内容であり,Javaは静的言語の代表者として,かなりの種類のシステムが豊富であるといえる.タイプ間の相互変換の問題はjavaプログラマー一人一人を悩ませており、コンパイラによってタイプを自動的に推定することで、タイプ変換が複雑すぎる問題を少し緩和することができます.小さな進歩といっても、私たちが毎日コードを書くプログラマーにとって、きっと大きな役割を果たすことができて、少なくとも気持ちはもっと楽しいです~~java 9の中で、私たちはjsやscalaのいくつかの動的な言語のように共通のタイプvarを得ることができます^^;