0

安全上のリスクだけがあるのか​​、それともリストをパラメータ化するときに得られる他の利点があるのか​​ を知りたい.

私はこの警告を受け取ります

リストは生の型です ジェネリック型への参照 リストはパラメータ化する必要があります

たとえば、リストを宣言するとき

List myList;

これに変更すると、警告はありません

List<?> myList;

警告が表示される理由がわかりました。これらの警告がたくさんあるコードがあり、それらすべての警告を修正する価値があるかどうかを知りたいです。私の質問は: リストをパラメータ化しないと、コードの実行が遅くなりますか? つまり、実行時にさらにチェックを行う必要がありますか?

編集:特定のタイプに変更すると、パフォーマンスに影響しますか?

List<String> myList;
4

5 に答える 5

4

リストをパラメータ化しないと、コードの実行が遅くなりますか?

番号

つまり、実行時にさらにチェックを行う必要がありますか?

番号

クラスをパラメータ化すると、コードの可読性が向上しますが、リフレクションを使用しない限り、すべてがコンパイル時間になります。

于 2011-07-27T08:06:00.500 に答える
2

すべての利点はコンパイル時のチェックにあり、実行中のコードは同じになります。そうは言っても、おそらく弾丸を噛んでコードを修正する必要があります。

編集

特定のタイプも、何らかの形でパフォーマンスに影響を与えることはありません。つまり、ジェネリック型情報はコンパイラ ( javac) のみが利用でき、コンパイラは最適化を行いません (いくつかの非常に些細で、ここでは関係のないものを除いて)。最適化は、ジェネリック型に関する情報にアクセスできない JVM と JIT コンパイラによって行われます。したがって、パフォーマンスの違いはありません。

于 2011-07-27T08:05:46.400 に答える
1

インスタンスをパラメータ化しないと、コンパイラは役に立ちません。

コンパイル時の型が本当にわからない場合を除き、コンパイル時のチェックを回避するために使用List<?>することはお勧めしません (これが当てはまる場合があるため、決して使用しないように言っているわけではありません)。

于 2011-07-27T08:09:54.523 に答える
1

これは間違いなく時期尚早の最適化の領域に分類されます。生成されたバイトコードのコレクションに型パラメータを追加するときにコンパイラによって行われる変更は、単なるキャストです。あなたが書くとき:

List<String> values = new ArrayList<String>();
values.add("One");
values.add("Two");

String value = values.get(0); // syntactic sugar

コンパイラは、最後の行に対応するバイトコードを生成します

String value = (String) values.get(0);

したがって、隠れたコストはキャストのコストです。「Java キャスティングはオーバーヘッドを導入しますか?」に対する Tom Hawtin の回答で指摘されているように、:

この種のことは、パフォーマンスとはほとんど無関係です。

私は同意する傾向があります-ジェネリックを使用するときに発生するパフォーマンスへの影響について心配する必要はありません。

于 2011-07-27T08:36:41.427 に答える
1
  1. コンパイル時のチェックにより、実行時のエラーの可能性が減少します。
  2. iterator を使用している間、明示的にキャストする必要がないため、コードの行数が削減されます。
  3. その良い習慣です。
  4. これにより、コードの可読性が向上します。
  5. また、新しいバージョンに適応する必要があると思います(ジェネリックはjdk 1.5で追加されました)
于 2011-07-27T09:25:28.540 に答える