Java Stream API类型不兼容:List<ArrayList>无法转为List<List>
Stream API创建List<List>的类型兼容问题
原循环代码:
List<List<String>> lists; for (int i = 0; i < n; i++) lists.add(new ArrayList<String>());
用Stream API写出的替代代码:
List<List<String>> lists = Stream.generate(ArrayList<String>::new).limit(n).toList();
遇到的编译错误:
error: incompatible types: List<ArrayList<String>> cannot be converted to List<List<String>>
问题原因
Java泛型是不可变类型,尽管ArrayList<String>是List<String>的实现类,但List<ArrayList<String>>和List<List<String>>属于不同的泛型类型,无法直接赋值——这就像你不能把List<String>直接赋值给List<Object>一样,是泛型类型安全规则的限制。
你的Stream代码里,Stream.generate(ArrayList<String>::new)生成的是Stream<ArrayList<String>>,调用toList()后得到的是List<ArrayList<String>>,自然无法赋值给声明为List<List<String>>的变量。
可行解决方案
方案1:用map做类型向上转型
通过map把每个ArrayList<String>显式转成List<String>,让Stream的泛型变为Stream<List<String>>:
List<List<String>> lists = Stream.generate(ArrayList<String>::new) .limit(n) .map(List<String>::cast) .toList();
方案2:使用Collectors.toList()收集
Java 8及以后的Collectors.toList()会自动推断泛型为父接口类型,收集后直接得到List<List<String>>:
import java.util.stream.Collectors; // ... List<List<String>> lists = Stream.generate(ArrayList<String>::new) .limit(n) .collect(Collectors.toList());
方案3:显式指定Stream的泛型类型
直接在Stream后指定泛型为List<String>,让生成的Stream从一开始就以父接口类型输出:
List<List<String>> lists = Stream.<List<String>>generate(ArrayList<String>::new) .limit(n) .toList();
内容的提问来源于stack exchange,提问作者Alex G
相关产品推荐
相关产品推荐

