Вероятно, в наибольшей степени влияние обобщений испытали на себе коллекции.
Скачать исходники для статьи можно ниже
Реально более 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 рублей