Бесплатный курс по Java: от основ до продвинутого уровня
Generics в Java
Если мы хотим сделать класс более гибким в плане типов, которые в нем используются, то можно воспользоваться обобщениями (generics).
Класс в примере ниже является обобщенным, так как в нем используется универсальный параметр с именем T.
Имя, кстати, не обязательно должно быть именно символом T, а может быть вообще любой символили набор символов, какой мы захотим. T — это не настоящий тип, он универсальный, или можно сказать неопределенный, или просто “какой-то тип”.
Настоящий же тип становится на место ненастоящего при создании объекта данного обобщенного класса. При создании объекта данного класса вместо T будет указываться нужный настоящий тип, который будет подставлен вместо всех T в коде класса. То есть при написании класса мы не знаем заранее, какой тип мы захотим использовать, когда будем создавать объект этого класса.
Гибкость в плане типов внутри класса очевидна.
То есть код класса один (этот код обобщенный, универсальный), а исполняться он может с любым типом, который программист захочет подставить вместо T, когда будет создавать объект.
Универсально? Универсально.
Поясним на примере:
class Account < T > {
private T id;
private int sum;
Account(T id, int sum) {
this.id = id;
this.sum = sum;
}
public T getId() {
return id;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
}
public class Generics {
public static void main(String[] args) {
// Здесь вместо ненастоящего T в <>
// передается настоящий String.
Account < String > acc1 = new Account < String > (“23d4g5”, 5000);
// То есть представьте, что вместо T
// в классе выше везде String,
// и на основе этого класса со String вместо T
// создается объект acc1.
String acc1Id = acc1.getId(); // выводим String id
System.out.println(acc1Id);
// Здесь вместо T передается Integer
Account < Integer > acc2 = new Account < Integer > (234545, 5000);
Integer acc2Id = acc2.getId(); // выводим Integer id
System.out.println(acc2Id);
}
}