一、为什么要使用泛型
泛型:标签
eg1以arrayList举例:集合没有类型检查,也就会类型不安全;强制类型转换时,可能出现类型转换异常
优化:通过在集合中增加泛型:使用泛型时,泛型是一个类型,不能使用基本上数据类型,需要使用其分装类(例如不能使用int,需要使用integer)
eg2:以hashMap举例
总结:
(1)集合接口或者集合类在jdk5.0时都修改为带泛型的结构
(2)在实例化集合类时,可以指明具体的泛型类型
(3)指明完以后,在集合类或者接口中,凡是定义类或者接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置都指定为实例化时的泛型类型
比如:add (E e)---》实例化以后::add(Integer e)
(4)注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换
(5)如果实例化时,没有指明泛型的类型,默认泛型类型为java.lang.Object类型
二、自定义泛型结构
1、泛型结构分为:分型类、泛型接口;泛型方法
eg:
自定义泛型类:
自定义泛型类、泛型接口的实例化及使用,如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为object类型;要求如果定义类类是带泛型的,建议在实例化时要指明类的泛型
eg:
eg3:继承Oder的子类,继承时已经写明了泛型的类型,则实例化时不需要再写为泛型类型
eg4:继承Oder的子类,继承时没有写明了泛型的类型,则实例化时需要再写为泛型类型
此时subOder1仍然是一个泛型类
2、自定义泛型类接口的注意点
eg:生命T类型的数组:
2、自定义泛型方法举例
不是类的方法中使用了泛型就是泛型方法
泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系;换句话说,泛型方法所属的类是不是泛型类都没有关系
eg:
泛型方法是可以生命为静态的。原因:泛型参数是在调用方法时确定的,并非时在实例化类时确定
三、泛型在继承上的体现
1、虽然类A和类B的父类,但是G<A>和G<B>二者不具备子父类关系,二者是并列关系,二者共同的父
类是G<?>
下面标识不可以的地方,会出现编译不通过
可以将String类型的数据放到object类型中去,但是在泛型中不可以,因为不具备子父类关系
四、通配符的使用:
eg:相当于list这样写可以作为list1和list2的通用父类
2、使用通配符后数据的读取和写入
(1)不能向其内部添加数据,null除外
(2)允许读取数据,读取的数据类型为Object
3、有限制条件的通配符的使用
(1)<?>:-无穷到正无穷
(2)? extends A:
G<? extends A>可以作为G<A>和G<B>的父类,其中B是A的子类
(3)?super A:
G<? super A>可以作为G<A>和G<B>的父类,其中B是A的父类