Вероятно, в наибольшей степени влияние обобщений испытали на себе коллекции.
Скачать исходники для статьи можно ниже
Реально более 90 процентов случаев, когда вы будите сталкиваться с обобщениями это обобщения в коллекциях.
После появления обобщений все коллекции были полностью перепроектированы. Теперь все коллекции изначально обобщены и многие методы, оперирующие коллекциями, также принимают обобщенные параметры.
Обобщения это то, чего не хватало коллекциям. Это – безопасность типов.
Раньше все коллекции хранили ссылки на класс Object, а это означало, что любая коллекция могла хранить объекты любого типа. Таким образом, можно было непреднамеренно сохранить несовместимые типы в одной коллекции. Это могло привести к ошибкам несовместимости типов во время выполнения.
Пример:
public class Main {
public static void main(String[] args) {
Car car1 = new Car("KIA");
Car car2 = new Car("AUDI");
Car car3 = new Car("RENO");
BMW bmw1 = new BMW("BMW 5x", 10000);
BMW bmw2 = new BMW("BMW 4x", 9000);
BMW bmw3 = new BMW("BMW 3x", 8000);
ArrayList<Car> carArray = new ArrayList<>();
carArray.add(car2);
carArray.add(car1);
carArray.add(bmw2);
carArray.add(car3);
ArrayList<BMW> bmwArray = new ArrayList<>();
bmwArray.add(bmw3);
bmwArray.add(bmw1);
bmwArray.add(bmw2);
Main.outArray1(carArray);
System.out.println();
Main.outArray1(bmwArray);
System.out.println();
Main.outArray2(bmwArray);
}
static public void outArray1(ArrayList<? extends Car> carAr) {
for (Car c : carAr) {
System.out.println(c.name);
}
}
static public void outArray2(ArrayList<BMW> carA) {
for (BMW c : carA) {
System.out.println(c.name + " " + c.cost + " рублей");
}
}
}
public class Car {
String name;
Car(String name) {
this.name = name;
}
}
public class BMW extends Car {
int cost;
BMW(String name, int cost) {
super(name);
this.cost = cost;
}
}
Программа имеет следующий выход:
AUDI
KIA
BMW 4x
RENO
BMW 3x
BMW 5x
BMW 4x
BMW 3x 8000 рублей
BMW 5x 10000 рублей
BMW 4x 9000 рублей


