В чем разница между классом с Generics (дженериками) и обычным классом в Java?

Ответ

Generics (обобщения) — это механизм параметризации типов, который позволяет создавать классы, интерфейсы и методы, работающие с разными типами данных, обеспечивая безопасность типов на этапе компиляции.

Основные отличия от обычного (непараметризованного) класса:

Аспект Класс с Generics Обычный класс
Безопасность типов Обеспечивается компилятором. Невозможно добавить элемент неверного типа. Отсутствует. Коллекции хранят Object, что может привести к ClassCastException во время выполнения.
Приведение типов Не требуется. Компилятор знает конкретный тип. Требуется явное приведение ((String)) при извлечении объектов.
Гибкость и переиспользуемость Высокая. Один обобщенный класс может использоваться с разными типами. Низкая. Для каждого типа данных нужен отдельный класс или используется Object с рисками.
Читаемость Выше. Код явно указывает, с каким типом работает (например, List<String>). Ниже. Неочевидно, какие типы объектов предполагается хранить.

Пример:

// 1. Обычный класс (до Generics) - НЕБЕЗОПАСНО
List rawList = new ArrayList();
rawList.add("test");
rawList.add(10); // Ошибка вставится только во время выполнения
String s = (String) rawList.get(0); // Требуется явное приведение
// String s2 = (String) rawList.get(1); // ClassCastException!

// 2. Класс с Generics - БЕЗОПАСНО
List<String> genericList = new ArrayList<>();
genericList.add("test");
// genericList.add(10); // ОШИБКА КОМПИЛЯЦИИ: несовместимые типы
String sSafe = genericList.get(0); // Приведение не нужно

Вывод: Generics устраняют необходимость в ненадежном приведении типов и перемещают многие ошибки, связанные с типами, из фазы выполнения в фазу компиляции.

Ответ 18+ 🔞

Ну, слушай, смотри, вот есть у тебя обычный класс, как этот старый дед в халате — вроде работает, но постоянно пиздит и может в любой момент накосячить. А Generics — это как тот же дед, но в современном костюме, с планшетом и чётким ТЗ. Он уже не накосячит, потому что компилятор его по рукам бьёт заранее.

Generics (обобщения) — это, грубо говоря, такая приблуда, которая позволяет тебе один раз написать класс, метод или интерфейс, а потом тулить в них любые типы, как в мясорубку. И всё это — с гарантией, что ты не засунёшь туда говна вместо фарша. Безопасность типов, ёпта!

Чем это лучше обычного класса, который просто на Object завязан?

Что сравниваем Класс с Generics Обычный класс (на Object)
Безопасность Ебучая крепость. Компилятор следит, чтобы ты не впихнул не пойми что. Попробуй — получишь ошибку сразу, а не в рантайме. Доверие — ноль ебать. Хранит всё подряд как Object. Вылетит ClassCastException в самый неподходящий момент, и будешь потом искать, кто тут кривой.
Приведения типов Не нужно, мать его. Компилятор сам всё знает. Достал элемент — и он уже нужного типа. Обязательно, блядь. Каждый раз, когда достаёшь объект, надо делать (String) или (Integer). Заебёшься, и ещё ошибешься.
Универсальность Овердохуища. Один класс — для всех типов. List<String>, List<Integer> — красота. Или копипаста на каждый тип, или один кривой класс на Object. И то, и то — пиздец.
Понятность кода Прям видно. Map<Integer, String> — сразу ясно, что ключ число, значение строка. Хуй пойми. Map map — а что там внутри? Может, Integer и String, а может, Cat и Dog. Загадка.

Смотри, как это выглядит на практике:

// 1. Старый способ, до Generics — пиздец опасный
List сыройСписок = new ArrayList();
сыройСписок.add("test");
сыройСписок.add(10); // Опа, блядь! Число в список строк? Ну ладно, прокатило...
String s = (String) сыройСписок.get(0); // Кастуем, как умеем
// String s2 = (String) сыройСписок.get(1); // А вот тут — БАБАХ! ClassCastException нахуй! Программа рухнет.

// 2. С Generics — всё чётко и безопасно
List<String> нормальныйСписок = new ArrayList<>();
нормальныйСписок.add("test");
// нормальныйСписок.add(10); // А вот это уже НЕ КОМПИЛИРУЕТСЯ! Компилятор орёт: "Не, мудила, это не String!"
String sБезопасное = нормальныйСписок.get(0); // Никакого каста! Всё чисто.

Итог, блядь: Generics — это как поставить на код систему видеонаблюдения. Раньше ошибки всплывали только когда уже всё ебнулось (в рантайме), а теперь тебя предупредят ещё на этапе написания: "Э, дружок, ты тут хуйню какую-то пытаешься впихнуть". Красота, в рот меня чих-пых!