第8章 泛型程序设计

本文深入探讨了Java中的泛型编程,包括为何使用泛型、如何定义泛型类和方法、类型变量的限定、泛型与虚拟机的关系、泛型的限制与局限性、继承规则、通配符类型以及泛型与反射的交互。通过实例展示了泛型在提高代码复用性和类型安全性上的优势。
摘要由CSDN通过智能技术生成

第8章 泛型程序设计

8.1 为什么要使用泛型程序设计

类型参数: new ArrayList<ClassType>();
通配符类型

8.2 定义简单泛型类

// 可以有多个类型变量
public class Pair<T>
{
	private T first;
	pair()
	{
		first = null;
	}
	public T getFirst()
	{
		return first;
	}
	public setFirst(T newValue)
	{
		first = newValue;
	}
}

8.3 泛型方法

// 类型变量 <T> 放在修饰符后面,返回类型前面,可定义在普通类中
public static <T> T getMiddle(T... a)
{
	return a[a.length / 2];
}
// 调用泛型方法,把具体类型放在方法名之前(大多数情况可省略,编译器能推断出)
String middle = <String>getMiddle("a", "b", "c");

8.4 类型变量的限定

可以有多个接口超类型,但最多有一个限定可以是类,而且它必须是限定列表的第一个限定。

// 限制T只能是实现了Comparable接口的类  T是限定类型的子类型
public static <T extends Comparable & Serializable, D> T min(T[] a) ...

8.5 泛型代码和虚拟机

  • 虚拟机没有泛型类型对象——所有对象都属于普通类;
  • 类型变量会被擦除,替换为其限定类型(无限定类型替换为Object);
  • 合成桥方法来保持多态;
  • 为保持类型安全性,必要时会插入强制类型转换。

8.6 限制与局限性

  1. 不能用基本类型代替类型参数,因为类型擦除后的Object类不能存储基本类型值;
  2. 运行时类型检查只适用于原始类型,虚拟机中对象总有一个特定的非泛型类型;
  3. 不能创建参数化类型的数组;
  4. 不能实例化类型变量;
  5. 不能构造泛型数组;
  6. 泛型类的静态上下文中类型变量无效;
  7. 不能抛出或捕获泛型类的实例;

8.7 泛型类型的继承规则

Pair<Employee>Pair<Manager> 没有关系
ArrayList<T> 实现了 List<T> 接口,可以转换为 List<T>

8.8 通配符类型

Pair<? extends Employee>  
Pair<Manager>
// 通配符的超类型限定(可以为方法提供参数,不能使用返回值)
Pair<? super Manager>
// 无限定通配符
Pair<?>

8.9 反射和泛型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值