私は、違いについて誤解があるようだ<Foo>
とし<? extends Foo>
。私の理解から、もしあれば
ArrayList<Foo> foos = new ArrayList<>();
これは、タイプのオブジェクトFoo
をこの配列リストに追加できることを示します。のサブクラスFoo
もtype Foo
であるため、次のようにエラーなしで追加できます。
ArrayList<Foo> foos = new ArrayList<>();
foos.add(new Foo());
foos.add(new Bar());
ここでBar extends Foo
。
さて、私が定義されていたと言うfoos
と
ArrayList<? extends Foo> foos = new ArrayList<>();
私の現在の理解はこれが表現するということsome unknown type that extends Foo
です。これは、サブクラスであるオブジェクトFoo
をこのリストに追加できることを意味します。差がないことを意味ArrayList<Foo>
してArrayList<? extends Foo>
。
これをテストするために、次のコードを記述しようとしました
ArrayList<? extends Foo> subFoos = new ArrayList<>();
subFoos.add(new Foo());
subFoos.add(new Bar());
しかし、次のコンパイルエラーでプロンプトが出されました
no suitable method found for add(Foo)
method java.util.Collection.add(capture#1 of ? extends Foo) is not applicable
(argument mismatch; Foo cannot be converted to capture#1 of ? extends Foo)
no suitable method found for add(Bar)
method java.util.Collection.add(capture#2 of ? extends Bar) is not applicable
(argument mismatch; Bar cannot be converted to capture#2 of ? extends Bar)
現在の理解に基づいて、のFoo
リストにa を追加できないのは<? extends Foo>
、それがサブクラスではないためです。しかし、なぜBar
リストに追加できないのか興味があります。
私の理解の穴はどこにありますか?
3
PECS(プロデューサー拡張、コンシューマースーパー)。
—
gnat
<? extends Foo>
ある特定や不明拡張するクラスFoo
。このクラスを使用した操作は、のサブクラスに対して有効である場合にのみ有効ですFoo
。
ワオ。Javaのジェネリックについて学習すればするほど、ねじれた状態になります。
—
メイソンウィーラー