Dlaczego wnioskowanie typu Java jest tak słabe?
Powiedz, mam metodę:
public static <T> Collection<T> addToCollection(T element, Collection<T> collection) {
collection.add(element);
return collection;
}
A następnie, próbując skompilować ten kod:
Integer i = 42;
Collection<Integer> result = addToCollection(i, Collections.emptyList());
Dostaję błądType mismatch: cannot convert from Collection<Object> to Collection<Integer>
. Czy ktoś mógłby wyjaśnić, dlaczego system typów nie może wywnioskować, że Collections.emptyList () powinien być typuCollection<Integer>
?
Powyższy przykład jest oczywiście całkiem sztuczny, ale cały czas natrafiam na to ograniczenie i jest to naprawdę denerwujące. Po przeczytaniuSkuteczna Java Dowiedziałem się, że możesz po prostu zrobićCollections.<Integer>emptyList()
(muszę powiedzieć, że to było dla mnie całkiem rewelacyjne) i że wszystko kompiluje się płynnie, ale kiedy masz jakiś skomplikowany typ, to naprawdę jest uciążliwe.
Zastanawiam się tylko, czy to jakiś rodzaj błędu, czy też istnieją jakieś uzasadnione powody, aby działał w ten sposób?