: why former produces unchecked compiler warning?-6ren"> : why former produces unchecked compiler warning?-这行代码 Class cls = (Class) Class.forName("java.lang.String"); 给出编译器警告 Type safety: Unchecked cast fr-6ren">
gpt4 book ai didi

java - 将 Class.forName ("java.lang.String")/'Class.forName("some_str_var")' 转换为 Class : why former produces unchecked compiler warning?

转载 作者:行者123 更新时间:2023-11-29 06:49:26 25 4
gpt4 key购买 nike

这行代码

 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<?>在编译期间(LHS 中的 cls 变量仍然是 Class<String> ),还没有类型信息被删除(编译器看到的是源代码,而不是类型信息被删除的字节码),并且编译器可以检查所有内容。

最佳答案

编译器不会对字符串常量"java.lang.String" 进行任何特殊处理。在这个调用中:

Class.forName("java.lang.String")

Class.forName只是众多方法中的一种,正如传递给它的参数只是众多字符串中的一种。

所以下面两个对于编译器来说是一样的(就返回类型而言):

String className = "java.lang.String";
Class<String> stringClass = Class.forName(className);

Class<String> stringClass = Class.forName("java.lang.String");

编译器不会检查常量参数来推断这必然是 Class<String> .如果你想得到Class<String>以类型安全的方式,您必须使用:

Class<String> stringClass = String.class

关于java - 将 Class.forName ("java.lang.String")/'Class.forName("some_str_var")' 转换为 Class<String> : why former produces unchecked compiler warning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53921389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com