Ограничение переменных типов Java

Ограничение переменных типов JavaИногда класс или метод нуждается в наложении ограничений на переменные типов. Приведем типичный пример. Нужно вычислить минимальный элемент массива:

Но здесь есть проблема. Взгляните на код метода min(). Переменная smallest имеет тип Т, а это означает, что она может быть объектом произвольного класса. Откуда мы знаем, имеет ли класс Т метод compareTo()?Решение заключается в том, чтобы наложить ограничение на тип Т, чтобы вместо него можно было подставлять только класс, реализующий Comparable — стандартный интерфейс с единственным методом compareTo(). Это делается добавлением ограничения (bound) переменной типа Т:

В действительности интерфейс Comparable сам является обобщенным типом. Пока мы проигнорируем эту сложность и предупреждения, которые генерирует компилятор.

Теперь обобщенный метод min() может вызываться только с массивами классов, реализующих интерфейс Comparable, таких как String, Date и тому подобнее. Вызов min() с массивом Rectangle даст ошибку во время компиляции, поскольку класс Rectangle не реализует Comparable.

В C++ вы не можете ограничить типы в параметрах шаблонов. Если программист создаст экземпляр шаблона с неправильным типом, сообщение об ошибке(часто невнятное) появится в шаблонном коде.

Вас может удивить, почему здесь используется ключевое слово extends вместо implements, весь Comparable — это интерфейс? Обозначение:

говорит о том, что Т должен быть подтипом ограничивающего типа. Ключевое слово extends выбрано потому, что это резонное приближение концепции подтипа, и проектировщики Java не хотели добавлять в язык новое ключевое слово(такое как sub).

Переменная типа или тип подстановки могут иметь несколько ограничений. Например:

Ограничивающие типы разделяются знаком &, потому что запятые используются для разделения переменных типа.

Как и в наследовании Java, вы можете иметь столько интерфейсных подтипов, сколько хотите, но только один из ограничивающих типов может быть классом. Если вы используете для ограничения класс, он должен быть первым в списке ограничений.

В программе которая будет представлена ниже, метод вычисляет минимум и максимум в обобщенным массиве, возвращая Pair<T>.