1为什么会有泛型的出现?
当创建一个Collection集合对象时,指向new ArrayList(),父类指向子类
Collection e=new ArrayList();
此时对象e的类型不明确,默认为Object类型,在需要时向下转型,可能会出现转型异常,这时虽然可以通过instenceof关键字处理这类问题,但是在有需要的情况下会出现多种转型异常,这时就会造成麻烦,因此出现了泛型的需求。
Collection g=new ArrayList();
for (Object obj:g) {
if(obj instanceof String){
String s=(String)obj;
}
}
此上就是用Instenceof处理转型异常的过程。
2.泛型的特点
泛型中必须是引用类型,基本类型会被自动装箱为包装类型
应用案例为:
Collection<String> e=new ArrayList<String>();
泛型实质上是类型参数化,参数只能是类类型,且可以是多个类类型
3.泛型类
定义一个泛型类
public class Dome<T> {
T name;
}
编译期间,如果父类传入的类型不明确,那么子类也应该定义为泛型类
public class DomeChild<T> extends Dome<T>{
//如果父类传入的类型不明确时,子那么类也是泛型类,二者传入的参数要一致
}
如果父类传入的类型已经确定,则子类无需定义为泛型类,因为子类不是泛型类时,创建子类对象时不能传入类型
public class DomeChild extends Dome<String>{
//如果父类传入的类型已经明确,那么子类无需定义为泛型类
}
4.泛型通配符
4.1类型通配符 “?”
可表示具体的类型实参,且只能在方法中的参数列表展示
4.2泛型类型上限 <?extends Number>
可传入的类型为Number以及Number类型的子类
public class DomeA<T> {
public static void main(String[] args) {
DomeA<Integer> o=new DomeA<>();
DomeA<Number> i=new DomeA<>();
o.method(o);
o.method2(i);
}
public void method(DomeA<?extends Number> db){
System.out.println("213561");
}
4.3泛型类型下限
可传入的类型为Number以及Number类型的父类
public class DomeA<T> {
public static void main(String[] args) {
DomeA<Integer> o=new DomeA<>();
DomeA<Number> i=new DomeA<>();
o.method(o);
o.method2(i);
}
public void method(DomeA<?super Number> db){
System.out.println("213561");
}
5.泛型擦除
泛型是java1.5之后的语法,以前的版本并不支持,所以底层使用的还是Object类;泛型信息只存在在编译阶段,在进入JVM之前,与泛型的相关信息将会被擦除,因此在java虚拟机里泛型类与普通类并没有什么区别。