一、为什么有java泛型?
在使用泛型前,存入集合中的元素可以是任何类型的,当从集合中取出时,所有的元素都是Object类型,需要进行向下的强制类型转换,转换到特定的类型,而转换的时候可能发生Exception。
泛型的出现使得程序员自己可以指定类型,这样集合就只能容纳该类型的元素。从而避免类型转换时候的异常。
泛型使用
二、集合中使用:
如下代码,我们可以把泛型当做一个特殊的类,其中的E用其他的Class代替:
List<E>lists = new ArrayList<E>();
未使用泛型之前:
List lists1= newArrayList ();
对于上边的list1,我们可以插入所有类型的对象。
使用泛型之后:
List<String>list2 = new ArrayList<String>();
对于上边的list2,我们只能插入String类型的对象。
三、定义泛型方法:
public <E>E test(E e){
System.out.println(e.getClass());
return e;
}
测试一下上面的方法:
public staticvoid main(String[] args) {
String count = "123";
TestGenericstestGenerics = new TestGenerics();
System.out.println(testGenerics.test(count));
}
结果:
class java.lang.String
123
四、在泛型中还有一种叫通配符(?)如下代码:
Collection<?> c=new ArrayList<String>();
c.add(newObject()); //compile time error,不管加入什么对象都出错,除了null外。
c.add(null); //OK
因为?是未知类型,你不确定向c中加入的到底是什么类型,所以什么类型都不能插入,除了null以外。
五、边界通配符(? extends Collection和? super ArrayList)
? extends Collection,指的是Collection的任意子类,例子:
List<? extends Object> list1 = new ArrayList<String>();
上述代码,你可以确定list1的数据类型是一个Object的子类,但不确定是哪个子类,所以就会出现,你不能向list1中添加任何对象,但是你可以从里面取对象,用Object来接收。
? super ArrayList,指的是Collection的任意父类,例子:
List<? super String> list2 = new ArrayList<String>();
这边list2跟上述的list1的情况正好相反。
六、泛型注意项:
① 假设A是B的子类,那么List<A>和List<B>就不是继承关系了。
② 从一个数据类型里获取数据,使用 ? extends 通配符,把对象写入一个数据结构里,使用 ? super 通配符,既想存,又想取,那就别用通配符。