Przechwytywanie symboli wieloznacznych w generycznych wersjach Java
Zto Samouczek Oracle Java:
Przykład WildcardError powoduje błąd przechwytywania podczas kompilacji:
public class WildcardError {
void foo(List<?> i) {
i.set(0, i.get(0));
}
}
Po tej demonstracji błędu rozwiązują problem za pomocą metody pomocniczej:
public class WildcardFixed {
void foo(List<?> i) {
fooHelper(i);
}
// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void fooHelper(List<T> l) {
l.set(0, l.get(0));
}
}
Po pierwsze mówią, że parametr wejściowy listy (i
) jest postrzegany jakoObject
:
W tym przykładzie kompilator przetwarzai
parametr wejściowy jako typ obiektu.
Dlaczego więci.get(0)
nie zwracaObject
? jeśli był już przekazany jako taki?
Ponadto jaki jest sens używania<?>
kiedy musisz użyć metody pomocniczej<T>
. Nie byłoby lepiej używać bezpośrednioT
co można wywnioskować?