泛型基础

泛型基础

1、泛型的背景和概念

  • 背景:Java推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够储存任意数据类型对象,而在使用该集合的过程中,需要程序员明确知道储存元素的数据类型,否则很容易引发ClassCastException异常,所以推出了泛型解决这一问题。

  • 概念: Java泛型(generics)是JDK5中引入的一个新特性,泛型是提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的数据类型结构。

    泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。

  • 优势: 1、类型安全检测 2、消除了强制类型转换

2、泛型类

2.1 泛型类的注意事项

1.不能用基本数据类型实例化类型参数

2.运行时候类型检查不适用于泛型

3.不能实例化泛型类型的数组

4.静态方法不能使用类上下文中定义的类型参数

5.泛型在异常中的使用,不能继承异常基类

6.类型擦出冲突

7.另一个泛型原则

2.2 从泛型类派生子类
  • 子类也是泛型类,子类和父类的泛型类型要一致
  • 子类不是泛型类,父类要明确泛型的数据类型
2.3泛型接口
  • 实现类是泛型类,实现类和接口类型需保持一致
  • 实现类不是泛型类,需要明确实现泛型接口的数据类型
2.4 泛型方法
  • 泛型方法能使方法独立于类而产生变化
  • 如果static方法要使用泛型能力,就必须使其成为泛型方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 * 泛型方法的基本介绍
* @param tClass 传入的泛型实参
* @return T 返回值为T类型
* 说明:
* 1public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
* 2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
* 3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
* 4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
*/
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
2.5泛型通配符?
  • 类型通配符一般是使用?来代替具体的类型实参

  • 所以,类型通配符是类型实参,而不是类型形参

    alt 类型通配符

2.6泛型通配符的上限和下限
  • 上限通配 只能是T的类型或者T的子类类型
  • 下限通配 只能是T的类型或者T的父类类型
2.7 类型擦除
  • 泛型只存在于编译阶段,运行时没有泛型信息 称为类型擦除

  • 有限制的类型擦除(上限通配符,采用T类型)

3 泛型与数组