Как получить ограниченные символы в Java?

В статье википедии о со-и контравариантности есть пример использования, а затем пояснительное предложение, описывающее, что означает объявление типа. Я считаю это чрезвычайно полезным. Прочитав объяснение несколько раз, я чувствую, что понимаю, что оно говорит.

<T extends Comparable<? super T>> T max(Collection<T> coll);

Ограниченный шаблон ? super T передает информацию, которая max вызывает только контравариантные методы из интерфейса Comparable.

Может кто-нибудь объяснить на аналогичном языке, что такое объявление типа andThen() функция в java.util.function.Consumer@FunctionalInterface средства:

public interface Consumer<T> {
    void accept(T t);
    default Consumer<T> andThen(Consumer<? super T> after) {

например

Ограниченный шаблон ? super T передает информацию, которая andThen....?


И у меня есть второстепенный вопрос: как я могу узнать сам, что означает такое объявление типа? Например, в первом примере выше из java.util.Collections util class: Как границы типов класса - T - способны передавать информацию о том, что делают методы T? Кто-нибудь может указать мне соответствующие параграфы в спецификации языка Java для этого?

1 ответ

Решение

Возможный ответ на первый вопрос:

public interface Consumer<T> {
    void accept(T t);
    default Consumer<T> andThen(Consumer<? super T> after) {

Ограниченный шаблон ? super T передает информацию, которая andThen принимает потребителей T или супертипы T ака. Противоположные потребители, как аргументы.


Возможный ответ на дополнительный вопрос: /questions/35460554/prodemonstrirovat-kovariatsiyu-i-kontravariantnost-v-java/35460563#35460563

По существу - полностью независимые от обобщенных (!) - возвращаемые методы возвращают "ковариантные" (предполагаемые "производители") в языке Java. Если вы переопределяете метод в дочернем классе, вы всегда можете объявить более конкретный тип возвращаемого значения.

Аргументы метода, конечно, также являются "ковариантными" - вы можете передавать только более конкретные объекты, чем указано в сигнатуре метода. Но на подклассах, хотя метод технически не переопределяется для непараметрических аргументов - придерживаясь https://en.wikipedia.org/wiki/Liskov_substitution_principle - часто имеет смысл объявлять "контравариантные" типы аргументов в дочерних классах, которые - если имя и другие аргументы равны - "перегружают" "методы в родительском классе. Диспетчеризация метода "статический" (управляемый ссылочным типом) будет гарантировать, что (менее конкретный) дочерний метод будет вызван победами. Предполагается, что аргументы метода "потребляются", а затем применяется PECS. Во всяком случае, для общих параметров генерируются методы моста, и все это немного сложнее. Но мы доберемся туда.

Другие вопросы по тегам