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

如何将二维ArrayList抽象为Collection<Collection>作为返回类型?

解决Java多维集合返回类型抽象的问题

你遇到的核心问题是Java泛型的不变性:虽然ArrayList<Object>是Collection<Object>的子类,但ArrayList<ArrayList<Object>>并不是Collection<Collection<Object>>的子类——泛型默认不支持这种嵌套的协变转换,这就是第一个代码无法编译的原因。

下面是两种简洁的解决方法,不需要逐个转换元素:

方法一:使用通配符放宽返回类型限制

调整方法的返回类型为Collection<? extends Collection<Object>>,利用? extends通配符允许泛型的协变匹配,这样直接返回ArrayList<ArrayList<Object>>就可以通过编译:

public Collection<? extends Collection<Object>> myFunction() {
  return new ArrayList<ArrayList<Object>>();
}

这种方式既隐藏了内部的具体实现(调用者只能将元素当作Collection<Object>操作,无法直接强转为ArrayList),又不需要修改内部集合的创建逻辑。

方法二:创建集合时直接使用上层接口泛型

如果可以控制集合的创建过程,在初始化外层集合时,将内部元素的泛型声明为Collection<Object>,这样返回的ArrayList<Collection<Object>>可以直接匹配Collection<Collection<Object>>的返回类型:

public Collection<Collection<Object>> myFunction() {
  ArrayList<Collection<Object>> result = new ArrayList<>();
  // 内部仍可以添加ArrayList<Object>,因为它是Collection<Object>的子类
  result.add(new ArrayList<Object>());
  return result;
}

这种方式的优势是返回类型更直观,调用者不需要处理通配符,同样能达到隐藏具体实现的目的。

两种方法的选择

  • 如果方法内部已经有现成的ArrayList<ArrayList<Object>>对象,不想修改创建逻辑,优先用第一种通配符方案。
  • 如果需要更清晰的返回类型,方便调用方使用,选择第二种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:20:04