第5行会运行期报错
private static void risky(List<String>... ts){
Object[] objects = ts;
List<Integer> integerList = Arrays.asList(1);
//把一个List<Integer>对象,付给了一个List<String>数组元素,造成了heap pollution
objects[0] = integerList;
//调用ts[0].get(0)时,编译器自动添加了(String)转化类型。因为ts[0].get(0)实际上时Integer类型,所以
//报出ClassCastException
System.out.println(ts[0].get(0));
}
测试代码
List<String> stringList = Arrays.asList("12aaa", "bbbb");
List<String> stringList2 = Arrays.asList("12aaa22", "bbbb22");
risky(stringList, stringList2);
报错信息
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at Item30.Test.risky(Test.java:55)
at Item30.Test.main(Test.java:48)
最好避免暴露varargs的引用。避免类似以下使用
Why?How?
public static <T> T[] toArray(T... ts){
return ts;
}
可用List替换varargs
替换后
//替换后
public static <T> List<T> flaten2(List<List<T>> lists){
List<T> ts = new ArrayList<>();
for(List<T> list : lists){
ts.addAll(list);
}
return ts;
}
替换前
public static <T> List<T> flaten(List<T>... lists){
List<T> ts = new ArrayList<>();
for(List<T> list : lists){
ts.addAll(list);
}
return ts;
}
本文深入探讨了Java中Heap Pollution现象及其导致的ClassCastException错误,通过实例代码演示了如何不当使用泛型和varargs参数可能导致类型安全问题,并提出了使用List代替varargs的改进方案。
2890

被折叠的 条评论
为什么被折叠?



