Mam interfejs A
, który implementuje narzędzia klasy B
.Java Generics Curiosity
Poniższa metoda rodzajowa działa
public static <T, U extends T> List<T> listFactory(Collection<U> source) {
return new ArrayList<T>(source);
}
ale
public static <T> List<T> listFactory(Collection<? extends T> source) {
return new ArrayList<T>(source);
}
nie (błąd kompilacji typu niedopasowanie), kiedy jestem kierowania wyjście do
List<A> tester = listFactory(B.defaultCollectionFactory(3));
defaultCollectionFactory(int count)
statycznie zapewnia kolekcję B
s, z domyślny schemat etykietowania.
Wszelkie spostrzeżenia na temat tego, dlaczego tak jest? Wygląda na to, że ogólny U i symbol wieloznaczny robią to samo.
Jak to działa "nie działa"? jaki jest komunikat o błędzie? – newacct
Wygląda na to, że masz dwie prawidłowe odpowiedzi poniżej, co jest przyczyną problemu - ale nie wziąłbym ich rady dosłownie. Trzymaj się wersji niezabezpieczonej, aby wywołanie metody nie musiało obejść tego ograniczenia symboli wieloznacznych. –
@newacct: błąd kompilacji, niedopasowanie typu – Carl