gpt4 book ai didi

在泛型上使用 Class.forName 时出现 JAVA 类型不匹配错误

转载 作者:行者123 更新时间:2023-12-02 03:17:02 24 4
gpt4 key购买 nike

请看下面的代码:

Class<? extends List> class1;
Class<? extends List<?>> class2;
Class<? extends List<? extends Object>> class3;
class1 = class2.asSubclass(List.class); // 1. OK
class1 = class3.asSubclass(List.class); // 2. OK
class2 = class1.asSubclass(List.class); // 3. Error Type Mismatch
class2 = class3.asSubclass(List.class); // 4. Error Type Mismatch
class3 = class1.asSubclass(List.class); // 5. Error Type Mismatch
class3 = class2.asSubclass(List.class); // 6. Error Type Mismatch
String className;
class1 = Class.forName(className); // 7. Error Type Mismatch
class2 = Class.forName(className); // 8. Error Type Mismatch
class3 = Class.forName(className); // 9. Error Type Mismatch
class1 = Class.forName(className).asSubclass(List.class); // 10. OK
class2 = Class.forName(className).asSubclass(List.class); // 11. Error Type Mismatch
class3 = Class.forName(className).asSubclass(List.class); // 12. Error Type Mismatch

1.、2.和10.都可以,我喜欢10.,特别是因为它干净,但我不喜欢使用RAW类型,所以我选择了通配符。

遗憾的是,由于类型不匹配错误,所有其他方法都失败了,除非我进行强制转换加上 @SuppressWarnings("unchecked") 组合。

这是一种必须使用 RAW 类型来避免强制转换和 @SuppressWarnings("unchecked") 的情况吗?

否则如何修复 11. 和 12.? (忘记3.到9.,它们只是在这里演示不同的组合,我的代码没有使用它们)

最佳答案

不幸的是,由于类型删除的各个方面,这是该语言的基本限制。表示非原始泛型类型的 Class 对象不存在,无法获取或创建。即使通过 == 进行比较,以下表达式也会生成相同的对象:

new ArrayList<Integer>().getClass();
new ArrayList<String>().getClass();
Class.forName("java.util.ArrayList");
ArrayList.class;

这会抛出一个ClassNotFoundException:

Class.forName("java.util.ArrayList<Integer>");

所以是的,你必须使用原始类型。

关于在泛型上使用 Class.forName 时出现 JAVA 类型不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40143628/

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