您的位置:首页 > 其它

了解到的一些泛型知识,以及在此过程中遇到的问题

2017-08-15 19:47 363 查看
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) {

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐