次のコード行で HashMap でエラーが発生するのはなぜですか? 割り当ての右側でワイルドカードを使用していません。
Map<String,?> map=new HashMap<String,?>();
そのようなパラメータ化された型をインスタンス化することはできません。ワイルドカードのパラメーター化された型は具体的な型ではないため、新しい式に表示できませんでした。
ワイルドカードのパラメーター化された型は、ジェネリック型の具体的なインスタンス化を含む型のファミリを示します。使用されているワイルドカードの種類によって、どの具体的なパラメーター化された型がファミリーに属するかが決まります。
したがって、は、 、、何でもMap<String,?>
あり得る型のファミリーを示します。実際のマップを作成するときは、具象型を使用する必要があります。Map<String, Object>
Map<String, String>
したがって、次のことができます。
Map<String,?> map=new HashMap<String, String>();
Map<String,?> map=new HashMap<String, Object>();
しかし、この宣言の問題点は、 map 以外には何も追加できないことですnull
。
一方、他のタイプのワイルドカード (上限付き、下限付き) を検討してください。
Map<String, ? extends Number>
この型によって示される型のファミリは具体的なインスタンス化であり、値の型はNumber
、または のサブタイプですNumber
。したがって、この場合、具体的なパラメーター化された型の有効な作成は次のとおりです。
Map<String, ? extends Number> map = new HashMap<String, Number>();
Map<String, ? extends Number> map = new HashMap<String, Integer>();
ただし、ここで問題となるのは、null
以前にマップから取得した値以外は、マップに何も追加できないことです。
Map<String, ? super Integer>
ご存知のように、無制限のワイルドカードまたは上限のあるワイルドカードを使用して、ワイルドカードのパラメーター化された型に何も追加することはできません。3 番目のタイプがあります。これは、マップに何かを追加する場合に使用できる下限ワイルドカードです。上記のパラメータ化された型の型のファミリは、型の値を取るもの、Integer
またはそのスーパー型です。したがって、次のようにインスタンス化できます。
Map<String, ? super Integer> map = new HashMap<String, Number>();
Map<String, ? super Integer> map = new HashMap<String, Integer>();
Map<String, ? super Integer> map = new HashMap<String, Serializable>();
しかし、ここで別の問題があります。それに値を追加することはできますが、何らかの値をフェッチするときに、どのタイプを取得するかはわかりません。
そのため、要件に応じて、いずれかのタイプのワイルドカードを使用する必要がある場合があります。質問の詳細情報が役立つ場合があります。ただし、一般に、ワイルドカードのパラメーター化された型のオブジェクトを作成することはできず、具体的なパラメーター化された型のみを作成することを覚えておいてください。
ただ行う:
class SuperBogusUnrelatedClass {}
// ...
Map<String, ?> map = new HashMap<String, SuperBogusUnrelatedClass>();
上記は正しく、100% 型安全です。真剣に、そこに何でも入れることができますMath
。なぜそれが正しいのですか?これはワイルドカードであるため、何でもかまいません。あなたはそれが何であるかを知りません。
上記の例のばかげたことは、この初期化がほぼ完全に役に立たない理由も示しています。型パラメーターが不明であるため、 ( を除くnull
)値を に安全に入れることはできませんMap<String, ?>
。したがって、あなたのMap
意志は空であるか、値が であるエントリで満たされている必要がありますnull
。したがって、基本的には a と同等Set
です。
具象クラスのオブジェクトをインスタンス化する際にワイルド カードを使用することはできません。
HashMap
オブジェクトを作成しているので、すべてのジェネリック パラメータを指定する必要があります。
型が型パラメーターであるオブジェクトをインスタンス化しています。それはできません。
コンパイラは未知の型のオブジェクトを作成する方法を知らないためです。
詳細情報型が型パラメーターであるオブジェクトを作成できますか?