Java泛型中List<Dog>无法传给List<Animal>参数的最优解决方案是什么
解决方案
最优实现方式是使用Java泛型的上界通配符定义方法参数,代码如下:
public void printNames(List<? extends Animal> list) { for (Animal a : list) { System.out.println(a.getName()); } }
说明
- 该写法支持传入
List<Animal>、List<Dog>、List<Cat>等所有Animal及其子类的列表,不需要额外编写重载方法,也不会出现类型擦除导致的签名冲突问题。 - 原理:
? extends Animal表示接收的List元素类型是Animal或者Animal的任意子类,遍历读取时所有元素都可以安全向上转型为Animal,调用getName()方法完全合法。 - 限制:如果方法内需要修改列表(比如添加、删除元素),该通配符写法会受限(仅支持插入null,无法插入其他具体对象),但仅做读取遍历的场景完全不受影响,是当前需求的最优解。
内容的提问来源于stack exchange,提问作者Kenji
相关产品推荐
相关产品推荐

