【Java学习笔记】37:泛型使用时要注意的约束

来源:互联网 发布:手机桌面图标转换软件 编辑:程序博客网 时间:2024/06/05 02:39

约束1:不能使用基本类型来作为泛型的抽象类型的实际参数
这是因为在JVM中是没有抽象类型的,所以泛型中的抽象类型会被替换成Object类型(该行为叫擦除),而基本类型不能直接赋值给Object类型,要使用基本类型则要使用它们的封装类。
需要注意的是:

Object obj=1;

虽然是可行的写法,但这涉及到自动装包解包的过程,即它实际上做的是:

Object obj=new Integer(1);

约束2:有关运行时的类型检查
这里写图片描述
这样做是行不通的,而只能检查属于哪个泛型类:
这里写图片描述
这也是因为JVM的擦除导致的,参数T被替换成了Object。
又如:

package day37;class MyClass<T>{}class Person{}public class Test {    public static void main(String[] args) {        MyClass<String> c1=new MyClass<String>();        MyClass<Person> c2=new MyClass<Person>();        System.out.println(c1.getClass());        System.out.println(c2.getClass());    }}

运行结果:
class day37.MyClass
class day37.MyClass

约束3:有关异常处理
①不能抛掷或捕获泛型类的对象,因它不能继承Exception类来实现自己的异常类。
这里写图片描述
②不能用catch捕获抽象类型变量的对象。
这里写图片描述

约束4:不能声明一个参数化类型的数组
这里写图片描述

约束5:泛型类型的抽象参数不能被实例化
这里写图片描述

约束6:不能在静态属性或方法中使用泛型类型
这里写图片描述

约束7:擦除后的冲突
这里写图片描述
首先任何类必继承Object类,所以必有Object类的方法:

public boolean equals(Object obj){//...}

前面写的那个equals方法和这个方法并不是覆盖关系(因为方法的参数不同),而在JVM中做了擦除后,T变成了Object,两个方法就产生了冲突。