如何声明可容纳父类与子类对象的List?Sonar不推荐List<?>写法
正确声明可容纳父类及子类对象的List
直接声明为 List<Animal> 就可以满足需求,这是Java多态特性的标准用法,完全符合Sonar的规范要求。
具体示例
先定义类结构:
class Animal {} class Dog extends Animal {}
然后声明并使用List:
List<Animal> animalList = new ArrayList<>(); // 可以直接添加Animal对象 animalList.add(new Animal()); // 也可以添加Dog对象,因为Dog是Animal的子类,自动向上转型 animalList.add(new Dog());
从List中读取元素时,无需强制转换,直接用Animal类型接收即可:
for (Animal animal : animalList) { // 统一处理Animal或其子类对象 }
为什么不推荐用List<?>
List<?>是无界通配符,它表示任意类型的List,但存在两个关键问题:
- 添加元素受限:除了
null,你无法往List<?>中添加任何具体类型的元素,编译器会报错,因为它无法确定List实际持有的类型。 - 读取元素需强制转换:从
List<?>中取出的元素默认是Object类型,必须强制转换才能使用,这会带来类型安全风险,也降低了代码可读性。
特殊场景的补充
如果你的场景是只读操作为主(比如接收一个已有的List,只做读取不做添加),可以用List<? extends Animal>,但这种写法同样不能往里面添加非null的元素,所以如果需要同时支持添加和读取,List<Animal>是最优解。
内容的提问来源于stack exchange,提问作者QTT
相关产品推荐
相关产品推荐

