- 泛型概念
- 参数化类型
- 泛型的好处
- 泛型的檫除
- 泛型的表示
- 泛型应用
- 泛型类
- 泛型方法
- 泛型接口
泛型是 Java SE5 出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。
简单说:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
- 把类型当作是参数一样传递
- <数据类型>只能是引用类型
- 代码更加简洁【不用强制转换】
- 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
- 可读性和稳定性【在编写集合的时候,就限定了类型】
JDK5提出了泛型这个概念,为了兼容JDK5之前版本。会把带有泛型特性的集合赋值给老版本的集合时候,会把泛型给擦除了
- 泛型只在编译阶段有效,编译之后JVM会采取去泛型化的措施。
- 泛型的运行阶段是没有效果 (反射机制验证,运行阶段无效)
泛型可以定义在类、接口、方法中,分别表示为泛型类、泛型接口、泛型方法。泛型的使用需要先声明,声明通过<符号>的方式,符号可以任意,编译器通过识别尖括号和尖括号内的字母来解析泛型。泛型的类型只能为类,不能为基本数据类型。尖括号的位置也是固定的,只能在类名之后或方法返回值之前。
一般泛型有约定的符号:E 代表 Element, 通常在集合中使用;T 代表 Type,通常用于表示类;K 代表 Key,V 代表 Value,
- 普通符号 < T>
- 无边界通配符 >
- 上边界通配符 extends E>
- 下边界通配符 super E>
规则
- 必须"先声明再使用,泛型的声明是通过"<>"实现。
public class PersonNew泛型方法{ private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } public PersonNew(T t) { this.t = t; } }
public class Demo07{ public K method1(K k,V v){ return (K)null; } public T method2(T t,V v){ return (T)null; } public static K method3(){ return null; }
静态方法中没法使用类中定义的泛型
泛型接口public interface CalGeneric> { T add(T a,T b); T sub(T a,T b); T mul(T a,T b); T div(T a,T b); }
public class CalIntegerGeneric implements CalGeneric{ @Override public Integer add(Integer a, Integer b) { return null; } @Override public Integer sub(Integer a, Integer b) { return null; } @Override public Integer mul(Integer a, Integer b) { return null; } @Override public Integer div(Integer a, Integer b) { return null; } }