You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实现:
    List<Animal> animals = miaus.stream().collect(Collectors.toList());
    
    生成的是可变集合,兼容低版本JDK环境。

注意:之前提到的双重强转方案存在严重的类型安全隐患,后续如果往强转后的List<Animal>中插入非Feline类型的Animal实例,运行时会抛出ClassCastException,完全不推荐使用。

内容的提问来源于stack exchange,提问作者mmalmeida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:24:04