Cod*_*ete 1 java generics reflection
这行代码
Class<String> cls = (Class<String>) Class.forName("java.lang.String");
Run Code Online (Sandbox Code Playgroud)
提供编译器警告 Type safety: Unchecked cast from Class<capture#1-of ?> to Class<String>
此外,根据API定义,它返回返回Class<?>:
Class<?> Class.forName(String arg)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么转换为Class<?>to Class<String>被视为未选中(即编译器无法检查编译时是否可以进行转换).
如果它是
Class<String> cls = (Class<String>) Class.forName("some_str_var");
Run Code Online (Sandbox Code Playgroud)
我可以理解编译器在编译时不能知道Class.forName()的返回类型(因为参数是一个变量,而不是文字),并且在运行时类型信息被删除.
但是在编译期间Class.forName("java.lang.String")是显而易见的Class<?>(并且clsLHS中的变量仍然是Class<String>),没有类型信息被删除(编译器看到源代码,而不是带有擦除类型信息的字节代码),编译器可以检查所有内容.
编译器不"java.lang.String"对此调用中的字符串常量进行任何特殊处理:
Class.forName("java.lang.String")
Run Code Online (Sandbox Code Playgroud)
Class.forName 只是众多方法中的一个,就像传递给它的参数只是众多字符串中的一个.
因此,以下两个对于编译器是相同的(就返回类型而言):
String className = "java.lang.String";
Class<String> stringClass = Class.forName(className);
Run Code Online (Sandbox Code Playgroud)
和
Class<String> stringClass = Class.forName("java.lang.String");
Run Code Online (Sandbox Code Playgroud)
编译器不检查常量参数以推断这必然是Class<String>.如果您想以Class<String>类型安全的方式进行,则必须使用:
Class<String> stringClass = String.class
Run Code Online (Sandbox Code Playgroud)