Java中如何将List<子接口>转换为List<父接口>类型?
首先明确问题的核心:Java泛型是不变的,就算Feline是Animal的子接口,List<Feline>也不属于List<Animal>的子类型,所以不能直接赋值。
方案1:调整方法签名(最推荐,无额外开销)
如果允许修改bar.pet方法的参数定义,直接将入参改为支持协变的通配符形式:
// 原方法定义如果是 public void pet(List<Animal> animals),修改为如下形式 public void pet(List<? extends Animal> animals)
调整后不需要任何赋值转换操作,直接调用即可:
bar.pet(miaus);
该方案没有任何运行时开销,不存在类型安全问题,完全符合Java泛型的设计规范。
方案2:无法修改方法签名时的简洁转换
如果bar.pet的方法签名固定不能调整,优先选择JDK自带的API实现类型转换,避免手写遍历和不安全强转:
- JDK 10及以上版本,使用
List.copyOf:
生成的是不可变集合,写法简洁,内部实现经过优化,类型安全。List<Animal> animals = List.copyOf(miaus); - JDK 8/9版本,使用Stream API实现:
生成的是可变集合,兼容低版本JDK环境。List<Animal> animals = miaus.stream().collect(Collectors.toList());
注意:之前提到的双重强转方案存在严重的类型安全隐患,后续如果往强转后的
List<Animal>中插入非Feline类型的Animal实例,运行时会抛出ClassCastException,完全不推荐使用。
内容的提问来源于stack exchange,提问作者mmalmeida
相关产品推荐
相关产品推荐

