Java-很深我只知其一-泛型
目录
泛型历史
泛型类/泛型接口
泛型方法
泛型属性
泛型约束
-
泛型历史
- JAVA 泛型(generics)是 JDK 5 中引入的一个新特性, 允许程序员在编程时指定类型参数,使编译器可以在编译代码时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
- JDK 7之后泛型可以简写成ArrayList<String> list = new ArrayList<>();
-
泛型类/泛型接口
- 一般用T,E,K,V,N,R表示,?表示通配符/占位符,约定与习惯吧。当然啊,用什么表示都可以,只要符合java规范即可。
- E - Element (在集合中使用,因为集合中存放的是元素) ,枚举Enum
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- 下面示例中,在类(接口)名后紧跟泛型声明(例如:<T>和<T1,T2,R>),代表此类(接口)中拥有的泛型数量,也就是说当前类(泛型)可以同时使用多少种数据类型。
- 如果类(接口)中出现相同泛型声明的属性、方法参数、方法返回值,则表示它们是同一类型。
-
泛型方法
- 泛型类(接口)已经声明的泛型在泛型方法中可以直接使用,没有声明的需要在方法上单独声明。
- 已经在类(接口)中声明的不可再方法上重复声明,数据域问题。
- 下面示例中用到了泛型参数和泛型返回值。
-
泛型属性
- 类属性要使用泛型,需要在类(接口)提前声明。
- 方法属性要使用泛型,需要在方法提前声明。
- 下面示例中GenericClazz类给的泛型为Demo,当然可以是任何类型,这里使用了引用类做示范。
-
泛型约束
- 下面视图存在两个引用数据类型Demo2和GenericClazz,Demo2继承了GenericClazz。
- ? 表示占位符/通配符,表示当前类型。
- ArrayList<? extends GenericClazz>:声明上界,表示参数化的类型可能是所指定的 GenericClazz 类型,或者是此类型的任意子类型。
- ArrayList<? super Demo2>:声明下界,表示参数化的类型可能是所指定的 Demo2 类型,或者是此类型的任意父类型。
- ? extends/ ? super 会导致泛型协变性,示例中红色报错点均为extends泛型协变性导致
- extends:对象可读、不可写。
- super :对象可读、可写。