当前位置: 首页 / 技术干货 / 正文
民哥带你快速精通java泛型(七)总结

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之后,规定< > 尖括号就是钻石操作符,里面的泛型可以省略不写,还是建议不要省略

  相信你已经掌握了大部分的泛型知识点了。对于还没有理解的知识点。

  希望你有时间可以多看看,多敲敲代码,多多练习。最后希望大家通过这一节泛型的学习,能够对泛型有一个深入的理解,并且能够在实际开发中熟练的运用!

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
IT培训IT培训
在线咨询
IT培训IT培训
试听
IT培训IT培训
入学教程
IT培训IT培训
立即报名
IT培训

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号