Эта строка кода
Class<String> cls = (Class<String>) Class.forName("java.lang.String");
Выдает предупреждение компилятора Type safety: Unchecked cast from Class<capture#1-of ?> to Class<String>
Кроме того, согласно определению API, возвращается: Class<?>
:
Class<?> Class.forName(String arg)
Я не понимаю, почему преобразование из Class<?>
в Class<String>
считается непроверенным (то есть компилятор не может проверить, возможно ли такое приведение во время компиляции).
Если это было
Class<String> cls = (Class<String>) Class.forName("some_str_var");
Я мог бы понять, что компилятор не может знать тип возвращаемого значения Class.forName () во время компиляции (, поскольку аргумент является переменной, а не литералом ), а во время выполнения информация о типе стирается.
Но Class.forName("java.lang.String")
является очевидным Class<?>
во время компиляции (и переменная cls
в LHS по-прежнему Class<String>
), информация о типе еще не стерта (компилятор видит исходный код, а не байт-код со стертымtype-info), и компилятор может проверить все.