Powiedzmy miałem metody takie jak to:
public List<? extends T> filterOutNulls(List<T> input) { ...
prawda, nie najlepszy podpis na świecie, ale nadal całkowicie legalne. Co by się stało, gdybym przekazał List<String>
tej metodzie? Zgodnie z podpisem, zwraca on List<? extends String>
. Jeśli Java zabroni tego typu, nie będzie można użyć tej metody dla List<String>
(a przynajmniej nie będzie możliwe użycie wartości zwracanej).
wtórnie składnia extends
jest nadal przydatna w tym przypadku, ponieważ List<String>
i List<? extends String>
mieć różne ograniczenia - w szczególności, nie można dodać nic innego jak null
dosłownym do List<? extends String>
. Czasami używam ? extends
, aby zaznaczyć, że kolekcja jest tylko do odczytu (ponieważ jedynymi s można przekazać są null
) i ? super
dla oznaczenia tylko do zapisu (ponieważ można tylko wyjść T
s jako Object
). Nie jest to całkowicie niepoprawne (nadal możesz wywoływać metody usuwania, przekazywać w postaci null
s, downcast itp.), Ale jest delikatnym przypomnieniem, w jaki sposób kolekcja prawdopodobnie ma być używana.
Dlaczego uważasz, że tak powinno być? – jason
@ L4zy Kiedy próbowałem użyć tej metody, otrzymałem ostrzeżenie ...Idź do tego, kompilując 'Niekompilowany kod źródłowy - Błędny typ sym:' –