Ben arasındaki fark hakkında bir yanlış anlamayı var gibi <Foo>
ve <? extends Foo>
. Anladığım kadarıyla,
ArrayList<Foo> foos = new ArrayList<>();
Bu tür nesnelerin Foo
bu dizi listesine eklenebileceğini gösterir. Alt sınıfları Foo
da tür Foo
olduğundan, ile gösterildiği gibi hatasız olarak eklenebilirler
ArrayList<Foo> foos = new ArrayList<>();
foos.add(new Foo());
foos.add(new Bar());
nerede Bar extends Foo
.
Şimdi, tanımlanmış olduğunu söylemek foos
olarak
ArrayList<? extends Foo> foos = new ArrayList<>();
Şu anki anlayışım bunun ifade ettiği some unknown type that extends Foo
. Bunu bir alt sınıf olan nesnelerin Foo
bu listeye eklenebileceği anlamına gelir ; yani ArrayList<Foo>
ve arasında bir fark yoktur ArrayList<? extends Foo>
.
Bunu test etmek için aşağıdaki kodu yazmaya çalıştım
ArrayList<? extends Foo> subFoos = new ArrayList<>();
subFoos.add(new Foo());
subFoos.add(new Bar());
ancak aşağıdaki derleme hatasıyla karşılaşıldı
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)
Mevcut anlayışım temelinde, neden Foo
bir listeye a ekleyemeyebileceğimi görebiliyorum <? extends Foo>
, çünkü bu kendi başına bir alt sınıf değil; ancak neden Bar
listeye a ekleyemediğimi merak ediyorum .
Anladığımdaki delik nerede?
<? extends Foo>
Bir olan belirli ve bilinmeyen uzanır sınıf Foo
. Bu sınıfla yapılan bir işlem, yalnızca herhangi bir alt sınıfı için yasal olacaksa yasaldır Foo
.