-
Notifications
You must be signed in to change notification settings - Fork 3
Generics
Зачем нужны Generics?
List в Java инвариантен, т.е если у меня есть два класса, один из которых наследник другого, например, List и List, то эти коллекции - не являются наследниками друг друга и подставить одну вместо другой мы не можем. Они инвариантны.
List<String> strings = new ArrayList<>();
List<Object> objects = strings; //wrong!
Так делать запрещено! Почему? Потому что если бы такое было разрешено, то мы бы получали ошибки в рантайме, которые сложно отследить. Когда я бы у коллекции objects какой-нибудь элемент кастовал бы в String, а он был бы не String.
Чтобы это работало - надо использовать ограничения. Так как у нас тут list - это producer данных, то использовать надо extends. //todo example
Есть еще ограничения super. Если у нас коллекция - это Consumer. Коллекция потребляет данные, т.е мы туда что-то записываем. Тогда можно написать так:
static void putAnimalToCollection(List<? super Animal> list) {
list.add(new Cat("Kitty"));
list.add(new Dog("Doggerman"));
}
Мы можем только писать туда, но не забирать оттуда данные.