2017-9-5-Java 泛型
Java 泛型学习
泛型可以解决数据类型的安全性问题。
简单泛型类
泛型方法
在一个普通类中定义一个泛型方法
类型变量的限定
类或者方法对类型变量加以约束
例如
public <T extends Comparable>
意思是将泛型参数T限制为Comparable
Java虚拟机中泛型转换小结
- 虚拟机中没有泛型,只有普通的类和方法
- 所有的类型参数都会被其限定类型替换
- 桥方法被合成来保持多态
- 为保持类型安全性,必要时插入强制类型转换
泛型的安全性警告
在实例化泛型类时,如果未指定一个具体的类型参数,会提示一个不安全操作的unchecked警告信息, 但是并不会影响使用
Java泛型的约束和局限
- 在泛型操作中子类的泛型类型是不能用父类的泛型类型来接收的。
- 不能用基本类型实例化类型参数,即类型参数不能为8种基本数据类型,可以使用其对应的包装类来完成。
- 运行时类型查询只适用于原始类型,因为运行时类型擦除,虚拟机中所有的类型查询只会产生原始类型。
- 不能创建参数化类型的数组,即不支持泛型数组。
- varargs警告
- 不能实例化类型变量
- 不能在静态域或者方法中引用类型变量
- 不能捕获或者抛出泛型类对象, 泛型类不能继承Throwable,在编译时期就会报错。
- 类型擦除后的冲突
泛型类型的继承规则
通配符类型
子类型限定通配符
例如
public void printBuddies(SimpleGenerics<? extends Employee> p)
参数p类型都是Employee的子类限定, 泛型操作设置为一个对象的范围上限。范型上限使用extends关键字声明,表示泛型的类型可能是所指定的类型或者是此类型的子类。
超类型限定通配符
例如
public void printBuddies(SimpleGenerics<? super Employee> p)
参数p类型都是Employee的超类限定,即表示的是任何被Employee继承的类。
泛型下限使用super进行声明,表示泛型的类型可能是所指定的类型,或者是此类型的父类型,或是Object(Object的是所有对象的超类)。
无限定通配符
可以匹配任意泛型对象
public void printBuddies(SimpleGenerics<?> p)
通配符捕获
泛型接口
不仅可以声明一个泛型类,也可以声明一个泛型接口,使用方式与之前相同。
泛型接口子类实现的两种方式
- 在子类的定义上声明泛型类型,此时子类仍然是一个泛型类
- 直接在接口中指定具体的类型,此时子类使用时不需要再指定泛型,因为声明子类时已经明确地指定了具体类型。