ホームページ  >  記事  >  Java  >  Java 8 の汎用ターゲット型推論メソッドの改善

Java 8 の汎用ターゲット型推論メソッドの改善

高洛峰
高洛峰オリジナル
2017-01-18 11:12:001384ブラウズ

1. ジェネリックスの簡単な理解

ジェネリックスは Java SE 1.5 の新機能です。ジェネリックスの本質はパラメータ化された型であり、操作されるデータ型がパラメータとして指定されることを意味します。人気のポイントは「型変数」です。このタイプの変数は、クラス、インターフェイス、メソッドの作成に使用できます。

Java ジェネリックスを理解する最も簡単な方法は、Java の型変換 (キャスト) 操作を節約できる便利な構文として考えることです:

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

上記のコード自体は非常に明確に表現されています: box は Apple を含むリストですオブジェクト。 get メソッドは Apple オブジェクト インスタンスを返します。このプロセスでは型変換は必要ありません。ジェネリックスを使用しない場合、上記のコードは次のように記述する必要があります:

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

2. ジェネリックスの恥ずかしさ

ジェネリックスの最大の利点は、プログラムの型安全性を提供し、下位互換性があることですが、同時に、毎回定義される ジェネリックの型は毎回指定する必要があります。この明示的な指定は少し冗長に感じるだけでなく、最も重要なことは、多くのプログラマはジェネリックに慣れていないため、正しい型パラメータを指定できないことが多いということです。コンパイラーはジェネリックスの型を自動的に推測するため、このような状況が軽減され、コードの可読性が向上します。


3. Java 7 でのジェネリック型推論の改善

以前のバージョンでジェネリック型を使用する場合、値の宣言と代入時に両側にジェネリック型を追加する必要があります。例:

Map<String, String> myMap = new HashMap<String, String>();

「変数の宣言時にパラメーターの型をすでに指定しているのに、オブジェクトの初期化時になぜ再度指定する必要があるの?」と思われるかもしれません。幸いなことに、Java SE 7 では、このメソッドが改善され、次のステートメントを使用して値を宣言して割り当てることができるようになりました:

Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"

このステートメントでは、コンパイラーは、変数が指定されたときにジェネリック型に基づいてインスタンス化を自動的に推論します。 HashMap のジェネリック型が宣言されています。繰り返しますが、新しい HashMap の後の「a8093152e673feb7aba1828c43532094」に注意してください。この「a8093152e673feb7aba1828c43532094」を追加すると、それは非ジェネリック型の HashMap になります。ソースコードをコンパイルすると警告が表示されます。

ただし: ジェネリック インスタンスを作成するときの Java SE 7 の型推論は制限されています。コンストラクターのパラメーター化された型がコンテキストで明示的に宣言されている場合にのみ型推論を使用できます。それ以外の場合は機能しません。例: 次の例は Java 7 では正しくコンパイルできません (ただし、ジェネリックスの型はメソッドのパラメーターに基づいて自動的に推論されるため、Java 8 ではコンパイルできるようになりました):

List<String> list = new ArrayList<>();
list.add("A");// 由于addAll期望获得Collection<? extends String>类型的参数,因此下面的语句无法通过
list.addAll(new ArrayList<>());

4. におけるジェネリック型推論の改善Java 8

Java 8 のジェネリック ターゲット型推論には主に 2 つのタイプがあります:

1. メソッド コンテキストを介したジェネリック ターゲット型推論をサポートします
2. メソッド呼び出しチェーンの最後のメソッドへのジェネリック型推論の受け渡しをサポートします
見てみましょう。公式サイトの例を見る:

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

JEP101 の特徴に従って、上記のメソッドを呼び出すと、次のように書くことができます

//通过方法赋值的目标参数来自动推断泛型的类型
List<String> l = List.nil();
//而不是显示的指定类型
//List<String> l = List.<String>nil();
//通过前面方法参数类型推断泛型的类型
List.cons(42, List.nil());
//而不是显示的指定类型
//List.cons(42, List.<Integer>nil());

5. まとめ

以上が JEP101 の特徴です。静的言語の代表である Java は、豊富な型システムを持っていると言えます。型間の変換の問題は、すべての Java プログラマーを悩ませています。コンパイラーを通じて型を自動的に推論することで、複雑すぎる型変換の問題をわずかに軽減できます。 これは小さな改善ではありますが、毎日コードを書くプログラマにとっては間違いなく大きな影響を与えるでしょう。少なくとも彼らはより幸せに感じるでしょう ~~ おそらく Java 9 では、js や動的変数のようなユニバーサル型 var が得られるでしょう。 scala の言語 ^_^

Java8 における汎用ターゲット型推論メソッドの改善に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。