java核心技术10阅读(七)-泛型程序设计

类型参数的好处
Java中增加范型类之前,泛型程序设计是用继承实现的。ArrayList 类只维护一个Object 引用的数组,利用ArratList有两个问题,一个是获取值时需要强制转换,另一个是强制转换时会产生错误。
使用类型参数解决:

ArrayList<String> files = new ArrayList<String>() 

其中String表示为String对象,此外,数组列表比数组(string [])要好 一些,因为它可以自动扩展。
1.定义泛型类
2.定义泛型方法,也可以在普通类中定义

泛型也需要某些限制,例如限制泛型参数必须实现某个接口,

public static <T extends Comparab1e> T min (T[] a) . . .

泛型代码和虚拟机
编译器把这个方法调用翻译为两条虚拟机指令:

Pair<Employee> buddies =...
Employee buddy = buddies.getFirstO;

•对原始方法 Pair.getFirst 的调用。原始方法指虚拟机将泛型参数进行了擦除,并转换成了Object或者指定超类
•将返回的 Object 类型强制转换为 Employee类型。

虚拟机中没有泛型,只有普通的类和方法。
所有的类型参数都用它们的限定类型替换。
•桥方法被合成来保持多态。
为保持类型安全性,必要时插人强制类型转换。

类型参数约束与局限性

  1. 不能用基本类型实例化类型参数,原因类型擦除后,只有Object类型
  2. ,试图查询一个对象是否属于某个泛型类型时,倘若使用 instanceof会 得到一个编译器错误,如果使用强制类型转换会得到一个警告。
  3. 不能创建参数化类型的数组,Pair[] table = new Pair[10] ; // Error
  4. 不能实例化类型变置
  5. 不能构造泛型数组
  6. 禁止使用带有类型变量 的静态域和方法
  7. 不能抛出或捕获泛型类的实例

泛型类型的继承规则
泛型类型之间没有继承关系,不存在引用关系,但是永远可以将参数化类型转换为一个原始类型

通配符

Pair<? extends Employee

表示任何泛型 Pair 类型,它的类型参数是 Employee 的子类, 如 Pair
Pair<? super Manager〉
表示任何泛型 Pair 类型,它的类型参数是 Manager 的超类, 如 Pair Pair

带有超类型限定的通配符可以向泛型对象写人,带有子类型限定的通配符可 以从泛型对象读取。

发布了15 篇原创文章 · 获赞 1 · 访问量 129

猜你喜欢

转载自blog.csdn.net/qq_17236715/article/details/104950974