Ограничение extends
Ограничение extends применяется в обобщениях Java
для задания верхней границы типа. Оно говорит компилятору,
что вместо параметра типа T можно подставить только
сам указанный тип или любой его наследник. В первом параметре
после ключевого слова extends указывается класс,
интерфейс или другой параметр типа, который становится
верхней границей. Благодаря этому внутри обобщенного кода
разрешается вызывать методы верхней границы, а также
безопасно возвращать значения типа T как значения
границы.
Синтаксис
<T extends Bound>
<T extends Bound1 & Bound2>
Пример
Давайте создадим обобщенный класс Box с ограничением
T extends Number и вызовем у значения метод
doubleValue, доступный благодаря границе:
public class Main
{
static class Box<T extends Number>
{
private T value;
public Box(T value)
{
this.value = value;
}
public double asDouble()
{
return value.doubleValue();
}
}
public static void main(String[] args)
{
Box<Integer> box = new Box<>(12345);
System.out.println(box.asDouble());
}
}
Результат выполнения кода:
12345.0
Пример
Давайте напишем обобщенный метод sum с ограничением
T extends Number, который складывает два числа
и возвращает результат в виде double:
public class Main
{
public static <T extends Number> double sum(T a, T b)
{
return a.doubleValue() + b.doubleValue();
}
public static void main(String[] args)
{
System.out.println(sum(1, 2));
System.out.println(sum(1.5, 2.5));
}
}
Результат выполнения кода:
3.0
4.0
Пример
Давайте используем ограничение с несколькими границами
через &: тип должен быть наследником класса
Number и реализовывать интерфейс Comparable:
public class Main
{
public static <T extends Number & Comparable<T>> T max(T a, T b)
{
if (a.compareTo(b) >= 0) {
return a;
} else {
return b;
}
}
public static void main(String[] args)
{
System.out.println(max(1, 2));
System.out.println(max(12345, 54321));
}
}
Результат выполнения кода:
2
54321
Смотрите также
-
extends-bound,
который задает верхнюю границу типа -
super-bound,
который задает нижнюю границу типа -
wildcard-extends,
который применяет extends в wildcard -
type-param,
который описывает параметры типа