Ограниченные подстановочные знаки являются заразными, что, по-видимому, вызывает сожаление на странице, на которую вы ссылаетесь. Ну, это нельзя отрицать ... но я думаю, что не вижу в этом такой большой проблемы.
Во многих случаях я возвращаю ограниченный подстановочный знак точно , потому что это заразно. JDK, к лучшему или к худшему (я говорю к худшему, но это другая мыльница :)), не имеет интерфейсов для коллекций только для чтения. Если я возвращаю List<Foo>
, который я не хочу, чтобы люди модифицировали (возможно, он даже безопасно завернут в Collections.unmodifiableList
), я не смогу заявить об этом в моей подписи. Как обходной путь бедняка, я часто возвращаюсь List<? extends Foo>
. Все еще можно попытаться изменить этот список, удалив элементы или вставив null
, но хотя бы тот факт, что вы не можете add(new Foo())
, служит напоминанием о том, что этот список, вероятно, доступен только для чтения.
В целом, я думаю, что возвращение чего-либо с ограниченным типом возврата вполне разумно, если вы действительно хотите, чтобы сайт вызова имел ограниченный доступ к объекту.
Другим примером может быть потокобезопасная очередь, которую вы передаете разным потокам, где один поток является производителем, а другой - потребителем. Если вы дадите продюсеру Queue<? super Foo>
, ясно, что вы намереваетесь положить в него предметы (а не вынимать предметы). Точно так же, если вы дадите потребителю Queue<? extends Foo>
, ясно, что вы намереваетесь вывести его (а не положить).