5

ジェネリックについて質問があります。

Map<? super String, ? super String> mappa1 = new HashMap<Object,Object>();

super を使用すると、 aHashMap<Object,Object>に対して aをインスタンス化できます<? super String>。ただし、String を拡張するオブジェクトのみを追加できます (この場合は String 自体のみ)。extendsワイルドカードで発生するのと同様に、コンパイルエラーで禁止しないのはなぜですか。つまり、一度 a を作成するMap <Object, Object>と、文字列を追加することしかできないということです..Map<String, String>そもそも a を強制的に作成しないのはなぜですか? extends(ワイルドカードで起こるように)

繰り返しますが、ジェネリックに関するsuperとの違いを知っています。extends上記の詳細を知りたいだけです。

前もって感謝します。

4

4 に答える 4

6

簡潔にするためListに代わりに使用しましょう。Map

基本的に、 と の実際的な意味は次のようextendssuper定義できます。

  • List<? extends T>List「あなたが得ることができるT」を意味します
  • List<? super T>List「あなたが入れることができるT」を意味します

extendsの動作は完全に対称的です。extendssuper

List<? extends Object> a = new ArrayList<String>(); // Valid, you can get an Object from List<String>
List<? extends String> b = new ArrayList<Object>(); // Invalid, there is no guarantee that List<Object> contains only Strings

List<? super String> a = new ArrayList<Object>(); // Valid, you can put a String into List<Object>
List<? super Object> b = new ArrayList<String>(); // Invalid, you cannot put arbitrary Object into List<String>
于 2013-07-08T10:58:42.860 に答える
0

あなたが説明している問題は存在しません。これは、参照が として宣言されているためMap<? super String, ? super String>です。しかし、実際のオブジェクトは任意のオブジェクトを保持できます。HashMap<Object,Object>

 Map<? super String, ? super String> mappa1 = new HashMap<Object,Object>();
 map1.put("", "");

//you can put only string to map1

//but you can do this
 Map map2 = map1;
 map2.put(23, 234);

同じことは、より良い例で説明できます。

String a = "a".
a.length(); // legal.

Object b = a;
b.length() // compilation error
于 2013-07-08T10:38:48.037 に答える