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

xiaoxiao2021-02-27  149

约束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,两个方法就产生了冲突。

转载请注明原文地址: https://www.6miu.com/read-13638.html

最新回复(0)