Каков будет результат выполнения данной Java-программы с использованием обобщённого класса?
Подробное объяснение
Код успешно компилируется и выполняется. Класс Error объявлен как обобщённый с параметром S, но параметр типа нигде не используется: поле obj имеет тип Object, а конструктор принимает Object. При создании объекта new Error<String>("10") строка "10" передаётся как Object, что корректно. Метод display() выводит obj через System.out.println, что для строки выводит её содержимое — "10".
Часто задаваемые вопросы (FAQ)
1
Что такое стирание типов в Java?
Стирание типов — это процесс, при котором информация о параметрах обобщённого типа удаляется во время компиляции, и вместо неё подставляются границы (обычно Object). Это сделано для обратной совместимости с кодом, написанным до введения дженериков.
2
Можно ли создать объект обобщённого класса без указания типа?
Да, можно, но тогда будет использоваться сырой тип (raw type), что может привести к предупреждениям компилятора. Рекомендуется всегда указывать параметр типа.
3
Почему в классе Error параметр типа S не используется?
Параметр типа S объявлен, но не используется в полях или методах. Это допустимо, но бесполезно. Обычно параметр типа используют для обеспечения типобезопасности, например, для поля типа S.
Типичные ошибки
1
Ожидание ошибки компиляции из-за несоответствия типов
Некоторые могут подумать, что из-за дженериков нужно передавать только объекты типа S, но так как параметр S не используется, компилятор не накладывает ограничений. Фактически тип стирается до Object.
2
Предположение, что будет выведено 10 в кавычках или с типом
Метод println для объекта вызывает toString, который для строки возвращает саму строку, поэтому выводится 10 без кавычек.
3
Утверждение, что программа не скомпилируется из-за использования raw type
Хотя new Error("10") без указания типа является сырым, в коде указано <String>, поэтому это не raw type. Компиляция проходит успешно.