Java泛型是在JDK 5中引入的一个特性,它允许在编译时进行类型安全检测,从而避免了在运行时进行类型转换的问题。泛型的本质是参数化类型,可以在类、接口和方法中使用。
什么是泛型?
所谓泛型,就是允许在定义类、接口、方法时使用类型形参(泛型),这个类型形参将在声明变量、创建对象、调用方法时动态地指定,进而让程序具备编译时检查能力
最常见的泛型应用场景便是在使用集合时通过泛型指定集合内对象的类型,为程序代码提供了编译时纠错的能力
泛型的优点
类型安全:泛型确保在编译时就检查类型,避免了运行时的类型转换错误。
代码复用:泛型使得代码更加通用,可以用于多种数据类型。
提高效率:减少了类型转换的次数,提高了程序的执行效率。
泛型的使用
泛型类:在类名后使用尖括号
<>
定义类型参数。泛型接口:在接口名后使用尖括号
<>
定义类型参数。泛型方法:在方法的返回类型前使用尖括号
<>
定义类型参数。
泛型的高级应用
有界类型参数:可以使用
extends
关键字限制类型参数的上限。通配符:使用
?
来表示未知类型,可以定义泛型的上下边界。泛型数组:由于类型擦除的存在,不能直接创建泛型数组,但可以使用
Array.newInstance
或集合类来替代。
枚举与泛型
枚举是Java中一种特殊的类,用于定义一组常量。枚举类型可以与泛型结合使用,例如定义一个泛型枚举类,或者在泛型类中使用枚举类型作为类型参数。
泛型在集合框架中的应用
Java集合框架广泛使用了泛型,如ArrayList<T>
、HashMap<K, V>
等,这些集合类通过泛型提供了类型安全的数据结构。
泛型的最佳实践
避免使用原始类型(raw types),以充分利用泛型的类型安全。
在设计泛型API时,考虑使用有界类型参数来增加灵活性。
谨慎使用泛型数组,可以使用集合类作为替代。
泛型的限制
泛型类型参数不能是基本数据类型。
泛型信息在运行时会被擦除,因此无法在运行时创建泛型类型的数组。
泛型在实际编程中的应用
泛型在实际编程中有着广泛的应用,例如在设计模式(如工厂模式)、API开发和框架设计中,泛型可以提高代码的复用性和类型安全性。
创建自定义泛型类
自定义泛型类,需要在类名后增加“<标识符>”
<T>与<E>的区别
标识符的字母本身并无强制要求,常见写法有两种
<T>是Type单词的首字母,说明传入的是类型
<E>是Element元素的首字母,代表是集合中的元素
泛型方法
允许在类没有声明泛型的前提下让方法独立使用泛型进行开发
泛型通配符
泛型的匹配规则
当明确指定泛型类型后,就必须强制使用该类型传入,该类型的子类也同样会报“类型不匹配”错误
为了增加泛型的匹配范围,泛型通配符<?>应运而生
<?>通配符与匹配范围
<?>代表所有类型均可传入
通过extends与super限定范围
extends关键字代表必须传入Shape或者子类才通过检查,extends决定泛型的上限
super关键词代表必须传入Rectangle或者其父类才能通过检查,super决定泛型的下限