Java中含List的Pair迭代时无法调用List方法的问题排查
问题原因与解决方法
核心原因
你碰到的问题本质是原始类型(Raw Type)导致泛型信息丢失:
- 当你用
for(Pair p: l)遍历集合时,p是未指定泛型参数的原始类型Pair,此时p.getValue1()的返回值会被编译器视为Object类型,而非实际存储的List<Integer>。 - 虽然打印时
Object会调用实际对象(List)的toString()方法,输出看起来和List一样,但编译阶段编译器无法识别它的真实类型,所以不允许调用size()、get()等List专属方法。 - 而通过
l.get(0)获取元素时,因为集合l的泛型是List<Pair<Integer, List<Integer>>>,返回的是带完整泛型的Pair实例,getValue1()会被正确识别为List<Integer>,因此能正常调用List的方法。
解决办法
方法1:给循环中的Pair指定完整泛型参数(推荐)
直接在循环声明里明确Pair的泛型类型,让编译器保留泛型信息:
import org.javatuples.Pair; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<Pair<Integer, List<Integer>>> l; l = new ArrayList<Pair<Integer, List<Integer>>>(); l.add(new Pair<Integer, List<Integer>>(1, Arrays.asList(7,9,13))); System.out.println(l.get(0).getValue0()); //prints: 1 System.out.println(l.get(0).getValue1().size()); // 正常调用size() // 这里指定泛型参数 for(Pair<Integer, List<Integer>> p: l){ if(p.getValue0().equals(1)) System.out.println(p.getValue1().size()); // 现在可以正常调用size() } } }
方法2:强制类型转换(不推荐)
如果一定要使用原始类型Pair,可以将getValue1()的返回值强制转换为List<Integer>,但这种写法会触发未检查转换的警告,且存在类型安全风险:
for(Pair p: l){ if(p.getValue0().equals(1)){ List<Integer> list = (List<Integer>) p.getValue1(); System.out.println(list.size()); // 转换后可调用List方法 } }
内容的提问来源于stack exchange,提问作者Mira Rotaru
相关产品推荐
相关产品推荐

