Скажите пожалуйста, чем отличаются два случая:
public class Main {
public static void main(String[] args) {
Class c1 = String.class; // Строка 3
Class<?> c2 = String.class; // Строка 4
System.out.println(c1 +", " + c2);
}
}
В 3-ей и 4-ой строках мы делаем что-то похожее, но компилятор предупреждает, что c1 будет ссылкой на объект сырого типа, а c2 для компилятора -- прекрасная ссылка на прекрасный объект Class<?>
Не понимаю разницы. И сырой тип и параметризованный знаком вопроса одинаково заполнены классом Object во время выполнения. Да и во время компиляции тот и другой обрабатываются по равному...
Возможно это просто философское предупреждение от Java, что сырой тип он сбивает с пути истины, а Class<?> сразу показывает, что программист нацелен пихать в c2 всевозможные классы?
Брюс Эккель в "Философия Java" пишет, что использование Class<?> вместо Class предпочтительнее, хотя оба варианта эквивалентны за тем лишь исключением, что при компиляции кода, где используется Class, будет выдаваться предупреждение. Кроме этого Эккель отмечает, что использование Class<?> указывает, что разработчик более осмысленно подошёл к выбору типа, а не используете просто Class по незнанию.
Вы теряете в безопасности типов в случае использования сырого типа, такого как List, но сохраняете ее при использовании параметризованного типа - Effective Java
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости