2

から取られたこの一般的なメソッドを検討してくださいEffective Java:

  // Generic method
    public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
     Set<E> result = new HashSet<E>(s1);
     result.addAll(s2);
     return result;
    }

そして、上記の一般的な方法を実行するためのこの方法:

// Simple program to exercise generic method
public static void main(String[] args) {
 Set<String> guys = new HashSet<String>(
 Arrays.asList("Tom", "Dick", "Harry"));
 Set<String> stooges = new HashSet<String>(
 Arrays.asList("Larry", "Moe", "Curly"));
 Set<String> aflCio = union(guys, stooges); //What does the type parameter help here?
 System.out.println(aflCio);
}

型パラメーターを提供しなかった場合、つまり<E>修飾子と戻り型の間で、型の参照aflCioSet<String>ユニオンメソッドの戻り値に割り当てることはできませんか? ここで私たちを購入する型パラメータは何ですか?

次の段落を理解するのに苦労しています。

ジェネリック メソッドの注目すべき機能の 1 つは、ジェネリック コンストラクターを呼び出すときに型パラメーターの値を明示的に指定する必要がないことです。コンパイラは、メソッドの引数の型を調べて、型パラメーターの値を判断します。上記のプログラムの場合、コンパイラは、union への両方の引数が Set 型であることを認識するため、型パラメーター E が String でなければならないことを認識します。このプロセスは型推論と呼ばれます。

戻り値の型の型パラメーターを として言及していませんかSet<E>。では、なぜ再度追加する必要があるのでしょうか?

4

4 に答える 4

4

おそらく、これを理解する最も簡単な方法は、代替案を検討することです。ジェネリック メソッドを使用しない場合、 に適した型を選択する必要がありますSet

Objectメソッドからを受け取りたくないため、 は有効な選択ではありません。Set<Object>それを に割り当てることはできませんSet<String>

// Nope 
public static Set<Object> union(Set<Object> s1, Set<Object> s2) {
  Set<Object> result = new HashSet<Object>(s1);
  result.addAll(s2);
  return result;
}

また、ワイルドカード?タイプも適切ではありません。繰り返しますが、これを に割り当てることはできませんSet<String>

代わりに、Java はまさにこのシナリオ用に設計されたジェネリック メソッドの構文を定義しました。

public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
  Set<E> result = new HashSet<E>(s1);
  result.addAll(s2);
  return result;
}

Set両方の入力で同じ型が使用されていれば、 に格納されている型は気にしません。コンパイラはSet<String>、入力がSet<String>s の場合に戻り値の型が になることを認識します。

于 2013-02-21T10:10:49.820 に答える
2

パラメーターは、 likeで実際のクラス名を指定するのではなく、型変数 E を使用する<E>ことをコンパイラーに知らせますList<E>List<String>

于 2013-02-21T10:19:39.343 に答える
0

これはあなたをもたらしますTypeSafetyTypeSafetyそれを保証する

  • 渡された引数と関数の戻り値の型は正しいデータ型です。
  • クラスは正しいデータ型のオブジェクトを扱います。

これは、他の開発者が作成したクラスや関数を使用する必要がある大規模なプロジェクトでは非常に重要です。関数やクラス定義を詳しく調べなくても、正しいデータ型のオブジェクトを渡したり取得したりできますClassCastExceptions

于 2013-02-21T10:28:26.443 に答える