java基础-泛型

一、为什么要使用泛型

泛型:标签

java基础-泛型

eg1以arrayList举例:集合没有类型检查,也就会类型不安全;强制类型转换时,可能出现类型转换异常

java基础-泛型

 

java基础-泛型 

优化:通过在集合中增加泛型:使用泛型时,泛型是一个类型,不能使用基本上数据类型,需要使用其分装类(例如不能使用int,需要使用integer)

java基础-泛型

java基础-泛型

 eg2:以hashMap举例

java基础-泛型

总结:

(1)集合接口或者集合类在jdk5.0时都修改为带泛型的结构

(2)在实例化集合类时,可以指明具体的泛型类型

(3)指明完以后,在集合类或者接口中,凡是定义类或者接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置都指定为实例化时的泛型类型

        比如:add (E e)---》实例化以后::add(Integer e)

(4)注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换

(5)如果实例化时,没有指明泛型的类型,默认泛型类型为java.lang.Object类型

二、自定义泛型结构

1、泛型结构分为:分型类、泛型接口;泛型方法

eg:

自定义泛型类:

java基础-泛型

java基础-泛型 

 自定义泛型类、泛型接口的实例化及使用,如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为object类型;要求如果定义类类是带泛型的,建议在实例化时要指明类的泛型

eg:

java基础-泛型

 eg3:继承Oder的子类,继承时已经写明了泛型的类型,则实例化时不需要再写为泛型类型

java基础-泛型 

java基础-泛型

  eg4:继承Oder的子类,继承时没有写明了泛型的类型,则实例化时需要再写为泛型类型

此时subOder1仍然是一个泛型类

java基础-泛型 java基础-泛型

 2、自定义泛型类接口的注意点

java基础-泛型

java基础-泛型 

 eg:生命T类型的数组:

java基础-泛型 

 java基础-泛型

2、自定义泛型方法举例

不是类的方法中使用了泛型就是泛型方法

泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系;换句话说,泛型方法所属的类是不是泛型类都没有关系

eg:

java基础-泛型 

java基础-泛型 

泛型方法是可以生命为静态的。原因:泛型参数是在调用方法时确定的,并非时在实例化类时确定 

三、泛型在继承上的体现

1、虽然类A和类B的父类,但是G<A>和G<B>二者不具备子父类关系,二者是并列关系,二者共同的父

类是G<?>

下面标识不可以的地方,会出现编译不通过

java基础-泛型 

可以将String类型的数据放到object类型中去,但是在泛型中不可以,因为不具备子父类关系

四、通配符的使用:

eg:相当于list这样写可以作为list1和list2的通用父类

java基础-泛型

 2、使用通配符后数据的读取和写入

(1)不能向其内部添加数据,null除外

java基础-泛型

 

java基础-泛型

(2)允许读取数据,读取的数据类型为Object

java基础-泛型

 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的父类

java基础-泛型​​​​​​​

 

上一篇:♠Linux命令随笔


下一篇:javaSE 笔记 File类