从 List< 类型的列表显式转换有哪些风险?在 Java 中将 MyObject> 扩展为 List 类型的列表?

2023-11-27

我认为标题应该解释一切,但以防万一......

我想知道以下 Java 代码片段可能会引起与转换相关的哪些风险和潜在问题:

List<? extends MyObject> wildcardList = someAPI.getList();
List<MyObject> typedList = (List<MyObject>) wildcardList;

我的想法是,通配符列表中的所有对象都应该是 MyObject 的实例(精确类型或子类),因此每当从 typedList 检索对象时,都不应该出现 ClassCastException。它是否正确?如果是这样,为什么编译器会生成警告?


只要从列表中检索对象就应该没有问题。但如果您对其调用其他一些方法,则可能会导致运行时异常,如以下代码所示:

    List<Integer> intList = new ArrayList<Integer>();
    intList.add(2);

    List<? extends Number> numList = intList;
    List<Number> strictNumList = (List<Number>) numList;
    strictNumList.add(3.5f);

    int num = intList.get(1); //java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Integer
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 List< 类型的列表显式转换有哪些风险?在 Java 中将 MyObject> 扩展为 List 类型的列表? 的相关文章

随机推荐