А можно привести пример, пожалуйста, чем именно declaration-site удобнее. Просто я понял там все равно также есть use-site
Тем, что можно для любого класса сказать, что "этот тип только на выход", и его пользователю не придётся обмазываться Foo<? extends T>
повсюду.
Просто сравните сигнатуры addAll у коллекций:
boolean addAll(Collection<? extends E> c);
vs
fun addAll(elements: Collection<E>): Boolean
В первом случае нельзя просто написать "Collection<E>", потому что Java не поймёт, что E в данном случае - ковариантный параметр, и там спокойно может быть подкласс E.
P.S. Глянул доку по дженерикам - а там как раз этот пример.