3

タイプ宣言を持つ 2 つのクラス、Foo と Bar があります。

class Foo<T>
class Bar<Foo>

これにより、Bar の Foo 引数がパラメーター化されていないため、コンパイラの警告が発生します。理想的には、コンパイラの警告を回避したいのですが、Bar がすべての Foo を受け入れるようにしたいと考えています。だから私はこれを試しました:

class Foo<T>
class Bar<Foo<?>>

これはうまくいくようですが、見逃している微妙な違いがあるのではないかと心配しています。ある?

4

2 に答える 2

5

はいあります。このことを考慮 -

List<?> myList;

null 以外をこのリストに入れることはできません。また、.を除いて、このリストから何も取得できませんObject。そのため、コンパイラは、異なる型のオブジェクトを追加できるようにすることで、このリストの型不変式を壊すことを許可しません。そうしようとすると、コンパイル時エラーが発生します。

しかし、次のリスト (生の型)を考慮すると-

List myList;

次に、ここから何でも入れたり、何かを取得したりできます。したがって、さまざまなタイプのオブジェクトを配置することで、このリストを簡単に破損することができます。これについてはClassCastException、実行時にのみわかります (運が良ければ....)。

したがって、あなたの場合、次のアプローチを使用します-

class Foo<T>
class Bar<Foo<?>>

できれば最初のものから離れてください。

詳細については、有効な Javaを確認してください-

  1. 項目 23 -新しいコードで生の型を使用しない
  2. 項目 26 -ジェネリック型を優先する
于 2013-08-31T09:51:16.490 に答える