Java中打印嵌套ArrayList遇方法冲突,如何正确实现?
解决Java嵌套ArrayList打印的泛型错误问题
第一个错误的原因
Java的泛型采用类型擦除机制,编译后所有泛型类型都会被擦除为原始类型。你的两个print方法:
<T> void print(ArrayList<T>)擦除后签名为void print(ArrayList)<T> void print(ArrayList<ArrayList<T>>)擦除后签名同样为void print(ArrayList)
两个方法签名完全重复,因此编译器报错“方法擦除后与其他方法重复”。
第二个错误的原因
你在print(ArrayList<T>)方法中,尝试对非基本类型/字符串的元素调用print(a.get(i)),但此时参数类型是T,而你的print方法只接受ArrayList<T>类型。只有当T本身是ArrayList时才能匹配,否则就会出现“方法不适用于参数”的类型不匹配错误。
解决方案
方案一:区分方法名避免擦除冲突
直接给处理嵌套列表的方法起不同的名字,从根源上避免签名冲突:
import java.util.ArrayList; class TBF { // 打印单层列表 <T> void printSingleList(ArrayList<T> a) { for (T element : a) { System.out.print(element + " "); } System.out.println(); } // 打印二维嵌套列表 <T> void printNestedList(ArrayList<ArrayList<T>> a) { for (ArrayList<T> subList : a) { printSingleList(subList); } } public static void main(String args[]) { // 测试二维字符串列表 ArrayList<ArrayList<String>> nestedList = new ArrayList<>(); ArrayList<String> sub1 = new ArrayList<>(); sub1.add("Hello"); sub1.add("World"); ArrayList<String> sub2 = new ArrayList<>(); sub2.add("Java"); sub2.add("Generic"); nestedList.add(sub1); nestedList.add(sub2); new TBF().printNestedList(nestedList); } }
方案二:通用递归打印(支持任意层级嵌套)
写一个通用方法,通过判断元素是否为集合类型,递归处理所有层级的嵌套集合,适用性更广:
import java.util.ArrayList; import java.util.Collection; class TBF { void print(Object obj) { if (obj instanceof Collection<?>) { // 如果是集合,遍历每个元素递归打印 Collection<?> coll = (Collection<?>) obj; for (Object element : coll) { print(element); } // 每打印完一层集合换行 System.out.println(); } else { // 普通元素直接打印 System.out.print(obj + " "); } } public static void main(String args[]) { // 测试三维嵌套列表(也支持二维) ArrayList<ArrayList<ArrayList<Integer>>> deepNestedList = new ArrayList<>(); ArrayList<ArrayList<Integer>> layer1 = new ArrayList<>(); ArrayList<Integer> layer2_1 = new ArrayList<>(); layer2_1.add(1); layer2_1.add(2); ArrayList<Integer> layer2_2 = new ArrayList<>(); layer2_2.add(3); layer2_2.add(4); layer1.add(layer2_1); layer1.add(layer2_2); deepNestedList.add(layer1); new TBF().print(deepNestedList); } }
内容的提问来源于stack exchange,提问作者TheBlueFriend
相关产品推荐
相关产品推荐

