Załóżmy, że mam dwie klasy A
i B
, która rozszerza A
. Z następującym sposobem mogę wydrukować Collection
z A
czy coś rozszerzenie A
:Czy <? rozszerza ...> wyłączność parametrów metody?
private static void print(Collection<? extends A> collection) {
for (A element : collection) {
System.out.println(element);
}
}
To wspaniałe, mogę zrobić coś takiego:
public static void main(String[] args) {
List<A> l1 = new ArrayList<>();
l1.add(new A());
l1.add(new B());
print(l1);
List<B> l2 = new ArrayList<>();
l2.add(new B());
l2.add(new B());
print(l2);
}
Teraz moje pytanie brzmi: dlaczego w moim sposobie main
(lub gdzie indziej) mogę napisać ten
List<? extends A> l3 = new ArrayList<>();
ale nie ten
l3.add(new A());
l3.add(new B());
Rozumiem, dlaczego nie mogę dodać wystąpienia A
lub B
w l3
. Ale dlaczego pierwsze stwierdzenie, które wydaje się bezużyteczne, jest autoryzowane?
EDIT
Pytam z innymi słowami, ponieważ myślę, że moje pytanie jest źle.
Co mogę zrobić z pustą listą List<? extends A> l3 = new ArrayList<>();
? Wiem, że nie można nic dodać, ponieważ typ listy jest nieznany.
to może być nawet 'Lista', gdzie 'C' jest kolejnym cl tyłek przedłużający "A". Więc również 'add (new B())' nie jest bezpieczny. –
Henry
Więc nie ma sensu pisać 'List extends A> l3 = nowa ArrayList <>();' ponieważ nie można jej później użyć? – cheb1k4
Jest użyteczny. Po prostu nie możesz do tego dodać. – VGR