6

私は最近 Java の試験を受けましたが、Java のワイルドカード ジェネリックについて幅広いセクションがありました。しかし、実際の使用法についてはほとんど語られていません。いつ使用する必要がありますか?典型的な使い方を見てみましょう:

void check(Collection<? extends Animal> list) {
  // Do something
}

このコレクションでは、リストに要素を追加することはできません。したがって、基本的にワイルドカードを使用してコレクションを読み取り専用にすることができます。それは彼らの唯一の使い方ですか?そのための実際的な必要性はありますか?過去 4 年間、私は Java で多くのプログラミング プロジェクトに参加しましたが、ワイルドカードのような機能を広範囲に使用するプロジェクトは見たことがありません。

では、実用的な観点から、ワイルドカードのジェネリックが避けられず、必要になる状況はありますか?

4

3 に答える 3

3

では、実用的な観点から、ワイルドカードのジェネリックが避けられず、必要になる状況はありますか?

とにかくJavaコンパイラがそれらを消去するため、それらが「避けられず必要」であるとは思いません。ただし、それらを使用すると、コンパイル時のより厳密な型チェックの利点が得られ、型キャストを回避できます。とにかくキャストをタイプしたいのは誰ですか?:)

ワイルドカードの使用に関するガイドライン

タイプ消去

于 2013-03-21T07:04:44.817 に答える
1
void check(Collection<? extends Animal> list) {
  list.add(new Animal()); // compile time error
  list.add(new Dog()); // compile time error. Dog is subclass of Animal class. 
}

Javaは、このようなジェネリックスを開発しました。これは、プログラマーが必要なものをコーディングできないようにするためです。許可されている場合は、後でランタイム環境で混乱が発生します。

プログラミングのある時点で、メソッドcheckがリストに要素を追加したくないが、それらの要素を読み取りたいというシナリオが発生します。

値を追加することしかできませんnull

于 2013-03-21T06:33:10.120 に答える
0

要するに、あなたの言っていることは間違っています。

「コレクションを読み取り専用にする」ことには何の関係もありません。

Collection がメソッドを宣言したため、要素を入力リストに追加できますadd(E)

ワイルドカードは簡単だと思います。ロジックは特定のタイプに対してのみ合理的であるため、実際には入力タイプを制約したいと考えています。

あなたの例では、あなたのチェックはアニマルのいくつかの方法を使用しているかもしれません

void check(Collection<? extends Animal> list) {
  // Do something
  for (Animal a : list) {
    a.checkAge();  // checkAge() is method of Animal
  }
}

がない? extends Animalと、上記のコードは機能しません。なぜなら、入ってくるリストは何でも (アニマルではない) のコレクションになる可能性があるからです。

したがって、リストから要素を取得し、その要素を Animal として扱っているため、コードが実際に意味をなすように、入ってくるコレクションが Collection または Collection などであることを確認したいと考えています。

于 2013-03-21T06:35:43.777 に答える