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?

questionAnswers(3)

yourAnswerToTheQuestion