3
// I know that this method will generated duplicate 
// trim keys for the same value but I am just
// trying to understand why we have a compile error:
// The method put(String, capture#11-of ?) in the type
// Map<String,capture#11-of ?> is not applicable for the arguments
// (String, capture#12-of ?)

void trimKeyMap(Map<String, ?> map){
  for (String key : map.keySet()) {
    map.put(StringUtils.trim(key), map.get(key)); // compile error
  }
}

入れたい値が map.get(key)別の型からのものである可能性があるのはなぜですか?

4

6 に答える 6

10

問題は、コンパイラがキーの型が「不明」であることしか認識していないことですが、Map のキーの型と返された型が同じget()未知の型であることを認識していないことです (私たち人間はそれが同じであることを認識していますが)。 .

機能させたい場合は、メソッドを入力して、同じ未知の型であることをコンパイラに伝える必要があります。次に例を示します。

void <V> trimKeyMap(Map<String, V> map) {
    for (String key : map.keySet()) {
        map.put(StringUtils.trim(key), map.get(key));
    }
}
于 2013-06-20T12:13:47.830 に答える
3

Java 5 の専門家グループが、ジェネリック メソッドの引数の型でのワイルドカードの仕様にもう少し力を加えることができたかもしれません。仕様段階で時間が足りなかったために、機能強化がうまくいかなかったと思います。ここで私自身の最近の質問を参照してください:メソッド内でワイルドカードを正式に使用できないことを JLS はどのように指定していますか?

より良い解決策がなければ、メソッドをジェネリック メソッドにする必要があります。

<V> void trimKeyMap(Map<String, V> map){
  for (String key : map.keySet()) {
    map.put(StringUtils.trim(key), map.get(key));
  }
}

リテラルMap<String, ?>を除いて、型に何も入れることはできません。null

Map<String, ?> map = new HashMap<String, String>();
map.put("A", null); // Works
map.put("B", "X"); // Doesn't work.

コンパイラは、マップの値の引数の型が であったことを知りませんString。したがって、マップ自体から値を取得したとしても、マップに何かを追加することはできません。

于 2013-06-20T12:12:11.560 に答える
1

?とは異なりObjectます。

AMap<String, ?>は、要素の型がわからない一般的なマップですが、まだ強制されています。つまり、何も配置できません。

于 2013-06-20T12:12:32.317 に答える
1

?任意のタイプのワイルドカードではありませんが、未知のタイプです。したがって、マップは?タイプのオブジェクトのみを受け入れ、 は受け入れませんString。この (かなり奇妙な) 事実からの 1 つの結論: でパラメータ化されたコレクションに値を追加することはできません?

于 2013-06-20T12:11:53.257 に答える
0

(ではないnull) 値をCollections に追加して、ワイルドカードMapsでパラメータ化することはできません。これは、ワイルドカードがオブジェクトの代わりになるものではなく、単なる未知のオブジェクトであるためです。したがって、 unknownのみを受け入れるマップに既知のオブジェクトを追加することはできません (そのように言えば) 。 ?

値を読み取ることしかできません。

于 2013-06-20T12:12:52.673 に答える