package cn.sdut.generictype;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/*
* 泛型通配符 以及上限 下限 擦除 堆污染
*/
public class GenericDemo {
public static void main(String[] args) {
/* 堆污染: 当一个方法即使用泛型又使用可变参数,此时就容易导致堆污染
*
* 如 Arrays中asList方法
* 特别注意 使用此方法返回的List不能Add和remove
*/
Integer[] a = {1,2,3,4};
List<Integer> list4 = Arrays.asList(a);
System.out.println(list4.toString());
// list4.add(5);会运行报错
// list4.remove(0);会运行报错
//解决办法:两种
// 第一种: List<Integer> list5 = new ArrayList<Integer>(list4);
/* 第二种: List<Integer> list5 = new ArrayList<Integer>();
Collections.addAll(list5, a);
list5.add(11);//正常
System.out.println(list5);*/
// Collections.copy();这个方法也有坑 看一看http://www.2cto.com/kf/201701/586860.html
//泛型的擦除
/*
* 1.泛型编译后就没了
* 2.当把带有泛型的集合付给不带泛型的集合,泛型就被擦除了
*/
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
List list2 = new ArrayList();
list2 = list1;
List<String> list3 = new ArrayList<String>();
list3 = list2;
String str = list3.get(0);//此时报错 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
}
private static void dowork(List<?> list) {
}
//上限 此时 必须是 Number或子类
private static void show(List<? extends Number> list) {
}
//下限 此时 必须是 Number或父类
private static void show2(List<? super Number> list) {
}
}
了解到的一些泛型知识,以及在此过程中遇到的问题
最新推荐文章于 2021-10-16 17:35:57 发布