2022-10-26
泛型 类型
第七关 泛型的点点滴滴
走到这里,小伙伴基本上把泛型学完了,是不是很有成就感啊,不要着急走开喔,后面还有些细节需要完善。下面我们一起把泛型的细节看一下
1.异常中使用泛型
由于泛型在使用过程会消失, 消失后泛型具体的类型就会用户Object类型来替代,Object 是没有 继承 Exception或者Throwable异常类的, 所以 在定义异常类时,不能使用泛型。
又是因为泛型在使用过程会消失,如果使用泛型来表示异常类型,泛型消失,那么泛型表示的异常就不复存在,就会造成泛型无法捕获或者处理这种情况。
接下来,小伙们我们一起看如下代码:
//1.自定义带泛型的异常类: 不合法,错误的写法。
class MyEx1<T> extends Exception{
public MyEx1(String message) {
super(message);
}
}
//2.定义泛型方法,抛出泛型T: 不合法
public class GenericDemo {
public <T> T doTest( T t){
try {
System.out.println("测试----");
}catch (T t){//错误的写法
throw t;//错发的写法
}
return null;
}
}
//3.定义泛型接口(类也可以): 合法,正确的写法,但不实用(没有实际用途)。
class GenericTest<E extends Exception>{
void process() throws E;
}
通过代码演示,我们会发现在异常使用泛型存在诸多问题,我们来归纳总结下:
1.自定义带泛型的异常类,不合法
由于代码在运行时,泛型会被擦除,那么T 会被擦拭成Object类,而Object类显然不会是Throwable的子类,因此它不符合异常的有关规定,所以java编译器不编译这种错误的写法。
2.定义泛型方法:抛出泛型T,不合法
其实道理和自定义带泛型的异常类的一样,最后T 会被擦拭成Object类,显然不是异常类,无法捕获、亦无法抛出
3.定义泛型接口(类也可以),正确的写法
因为我们定义了泛型的上限,即使运行时,T会被擦除,那么java编译器依然会把它看成异常,所以不会报错。
但是这种写法,还不如定义非泛型接口或者非泛型类,没有多大实际用途,所以小伙伴知道就可以了。
2.数组与泛型
不能声明参数化类型的数组, 数组可以记住自己的元素类型,不能用普通方法建立一个泛型数组。
(当然 你如果用反射还是可以创建的,用Array.newInstance。因为在反射时,泛型就消失了)
如下所示:
//定义泛型测试类:
class ArrDemo<T>{
public T[] arr1;//标准写法,后期运行时不会引发问题
public ArrDemo<Integer>[] arr2;//不标准写法,后期运行时可能会引发问题
public static void main(String[] args) {
//1.创建对象
ArrDemo<String> ad = new ArrDemo<String>();
//2.操作数组
String[] str_arr1 = ad.arr1;//在创建对象是T指的是String ,arr1就是String类型的数组。
ArrDemo<Integer>[] ad_arr3 = ad.arr2;//ad的泛型是String ,新定义的Integer可能会引发问题
}
}
3.泛型方法
在能够使用泛型方法的时候,尽量避免使整个类泛化。
如下所示:
public class GenericDemo4 {//1.标准: 推荐的写法
//1.定义一个泛型方法:
public <E> E test2(E e){
System.out.println("自定义泛型的方法:"+e);
return e;
}
}
4.泛型类型必须是应用类型,不能是基本类
如下所示:
Listlist2 = new ArrayList();//正确的写法: 引用类型
Listlist2 = new ArrayList();//错误的写法: 基本类型
5.虚拟机中没有泛型,只有普通类和普通方法
因为泛型在编译阶段我们能看到,可以规范我们开发者使用的类型。
但是泛型在编译后的class文件,以及最终到 JVM虚拟机中运行,这是泛型被擦除了,所以在虚拟机中只有普通类和普通方法。
闯关练习
请选择下面描述正确的选项
A: 泛型可以使用基本类型表示
B: 泛型类中必须定义泛型方法
C: 在异常操作中,通常不使用泛型
D: 泛型类型必须是引用类型
答案:C D
第八关 课程总结
这个小节的内容已经学习完了,小伙伴们是不是感觉收获多多!
刚才我们一起了解了泛型的基本信息和使用,同时完成了几个闯关小练习,小伙伴现在对泛型的感觉如何呢。
现在,我们一起做个总结吧。
了解泛型是什么 泛型即: "参数化类型",可以把泛型作为"参数", 泛型可以指任意类型,规范java代码的书写
了解泛型的优点 泛型可以进行编译期间进行类型检查 泛型可以避免类型强转
掌握泛型的定义和使用
定义泛型接口
定义泛型类
定义泛型方法
在实际开发的场景中能够使用上面定义的泛型
了解泛型的通配符,以及泛型的上限和下限
泛型的上限,有时又称之为上边界,指的是泛型不能超过extends的类型
泛型的下限,有时又称之为下边界,指的是泛型得高于super的类型
了解泛型的擦除机制和补偿措施
泛型在编译后的class文件中就消失了。
泛型在使用时应尽量避免new T(),或者使用instanceof, 因为这两类操作要知道确切的类型。
泛型的补偿措施:简单工厂,工厂方法,模板类,需要小伙们好好学习一下。
了解什么是钻石操作符
java7之后,规定< > 尖括号就是钻石操作符,里面的泛型可以省略不写,还是建议不要省略
相信你已经掌握了大部分的泛型知识点了。对于还没有理解的知识点。
希望你有时间可以多看看,多敲敲代码,多多练习。最后希望大家通过这一节泛型的学习,能够对泛型有一个深入的理解,并且能够在实际开发中熟练的运用!
下一篇:gateway介绍(一)
开班时间:2021-04-12(深圳)
开班盛况开班时间:2021-05-17(北京)
开班盛况开班时间:2021-03-22(杭州)
开班盛况开班时间:2021-04-26(北京)
开班盛况开班时间:2021-05-10(北京)
开班盛况开班时间:2021-02-22(北京)
开班盛况开班时间:2021-07-12(北京)
预约报名开班时间:2020-09-21(上海)
开班盛况开班时间:2021-07-12(北京)
预约报名开班时间:2019-07-22(北京)
开班盛况Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号