0

次のコードがあります。

String test = "[{\"color\":\"red\"}]";
Class<? extends Base> baseObject = Base.class;
Collection<? extends Base> elements = new ArrayList<Base>();
 if (test.startsWith("[")) {
    elements.addAll(new ObjectMapper().readValue(test, Collection.class));
 } else {
   elements.add(new ObjectMapper().readValue(test, baseObject));
}

しかし、私は乗ります

elements.addAll(new ObjectMapper().readValue(test, Collection.class));

コンパイル警告:

The expression of type Collection needs unchecked conversion to conform to Collection<? extends capture#1-of ? extends Base>

そしてelements.add(new ObjectMapper().readValue(test, baseObject));

コンパイル エラー:

The method add(capture#2-of ? extends Base) in the type Collection<capture#2-of ? extends Base> is not applicable for the arguments (capture#3-of ? extends Base)

なにが問題ですか?

4

2 に答える 2

1

ワイルドカード型を使用してコレクションに物を追加することはできません ( superBrian によると、これには を使用した明示的な下限がありません。サブクラスは常にそのスーパークラスの 1 つにキャストできるため、これにはある程度の意味がありますが、私は超境界ワイルドカードをあまり使用したことがないので、詳細はよくわかりません)。

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

具体的には:

の要素型が何を表しているのかわからないcため、オブジェクトを追加することはできません。このメソッドは、コレクションの要素add()の型である type の引数を取ります。E実際の型パラメーターが の?場合、それは未知の型を表します。渡すパラメータはadd、この未知の型のサブタイプでなければなりません。型がわからないので、何も渡すことができません。唯一の例外はnull、すべての型のメンバーである です。

型消去は...そうですね。

于 2013-06-11T15:01:41.570 に答える