泛型——笔记

一、泛型程序设计

  1. 为什么要使用泛型?
    泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集String和File对象来分别设计不同的类,实际上,也不需要这样做,因为一个ArrayList类可以聚集任何类型的对象。
  2. 泛型类和泛型方法
  public class Test<T>{
      ....
   }

泛型方法,泛型方法可以定义在普通方法中,也可以定义在泛型类中,在调用泛型方法时,在方法名前的尖括号中放入具体的类型。
在这里插入图片描述
在这里插入图片描述
3. 泛型变量,泛型也可以为变量类型的数据类型
4. 泛型变量的限定
有时,类或方法需要对类型变量加以约束,比如说用到compareTo方法的,要想使用compareTo方法必须是实现了Comparable接口。但是不能确保传进来的参数就是实现了Comparable接口这时可以为方法设置限定,如

  public static <T extends Comparable> T min( T[]a ){
      // 比较大小
}

实际上Comparable接口本身就是一个泛型类型,方法中的T继承了Comparable接口后,如果传进来的参数没有实现Comparable接口,则会产生编译错误。
上述还存在 一个问题,就是如果要设置多个限定呢?
则可以改为:

 public static <T extends Comparable&Seriallizable> T min( T[]a ){
      // 比较大小
}

因为逗号用来分隔泛型类型变量
5.泛型和虚拟机
虚拟机没有泛型类型对象,即所有对象都属于普通类。
无论何时定义一个类型类型,相应的原始类型都会被自动地提供。原始类型的名字就是删去了类型参数的泛型类型的名字。类型变量被擦除,并用其限定类型(无限定的变量用Object)替换;这种类型擦除,会产生一种多态问题,这个时候需要编译器生成一个桥方法。
这些都比较底层,暂未进入深入研究,总之,要记住有关Java泛型转换的事实:
1)虚拟机中没有泛型,只有普通的类和方法
2所有的类型参数都用他们的边界替换
3)桥方法被合成为保持多态的
4) 为保持类型安全性,必要时插入强制类型转换
6. 关于泛型中的常见错误
1)不能在catch(T e)这样是错误的,但是一个方法可以抛出一个异常,如 throw T是合法的
2)不能声明参数化类型的数组
3)不能实例化泛型类型
4)不能建立一个泛型数组
5)不能在静态域或方法中引用类型变量
6)擦除后的冲突,当泛型类型被擦除时,创建条件不能产生冲突,比如在Pair类中添加如下equals方法

  public class Pair<T>{
       public boolean equals(T value){ return first.equals(value) && second.equals(value);}

编译时, 方法擦除T,进而将 equals(T)方法转换为equals(Object)方法,这与Object中的方法冲突。
7.通配符类型
Pair<? extends Employee> 表示任何泛型Pair类型,它的类型参数是Employee的子类,如Pair,但不是Pair
8.通配符的超类类型限定
通配符限定与类型变量限定十分类似,但是,它还有一个附加的能力,即可以指定一个超类型限定。
? super Manager
直观地将,带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。
9.反射和泛型
在这里插入图片描述
在这里插入图片描述

发布了65 篇原创文章 · 获赞 48 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/chen15369337607/article/details/103381280
今日推荐