私は、違いについて誤解があるようだ<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のジェネリックについて学習すればするほど、ねじれた状態になります。
                
                
                  
                    —
                    メイソンウィーラー