泛型:
一种参数化的类型
- //非泛型,不是参数化类型
ArrayList list0 = new ArrayList();
list0.add("abc");
list0.add(10);
- //泛型标准做法,参数化类型 参数是String类型
ArrayList<String> list1 = new ArrayList<String>();
list1.add("abc");
list1.add("def");
- //泛型,不推荐,非标准做法
ArrayList list2 = new ArrayList<String>();
list2.add("abc");
list2.add("def");
list2.add(10);
new Demo1().xxx(list2)
- //泛型,但不推荐
ArrayList<String> list3 = new Demo1().yyy();
list3.add("abc");
list3.add("def");
- //下列的做法是错误的做法,编译报错,两边泛型必须一致
//ArrayList<Object> list4 = new ArrayList<String>();
自定义泛型
-类上的泛型,泛型类
泛型一定要先定义,后使用,在类的名字后面定义泛型的类型一定要引用
数据类型,不能是基本数据类型不能对确切的泛型类型使用instanceof关键字
比如:
//此种写法语法报错
if(num instanceof Generic<Number>){
}
定义在类上,在类的内部起作用,在整个类的范围内类型一致类上的泛型的具体类型需要在创建类的对象的时候指定泛型的具体类型
如果在使用类上的泛型时不指定泛型的具体类型,默认的具体的类型为泛型 的上边界
-方法上的泛型,泛型方法
泛型要先定义,后使用.在返回值之前定义通常用一个大写的字母来定义一个泛型,可以定义多个,且定义在方法上,在方法的
内部起作用,方法上的泛型,在方法被调用的时候自动推断出具体的泛型,无论何时,尽量使用泛型方法,因为作用域小,只局限
于方法
比如:
public<T> T save(T t){
return t;
}
<T>就是标志,标志此方法是一个泛型方法,放在修饰符合返回类型之间可以放
置多个符号<T,E>,说明有两个类型需要参数化确定
泛型的上边界:
泛型所取的类型是上边界类或上边界类型的子孙类型
如果不指定泛型默认上边界是Object
泛型擦除:
泛型在编译期间起作用,真正执行期间,泛型已经被擦除了.在编译阶段,编译器会将所有使用泛型的地方
替换为该泛型的上边界,并在必要的时候增加上必须的类型强制转换和类型检查,所以在执行期间没有泛型的概念
泛型在编译期间就被擦出掉了,此过程就叫做泛型擦除