天天看点

Java 基础 - 泛型

什么是泛型?

"参数化类型",将类型由具体的类型参数化,把类型也定义成参数形式(称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

是 JDK 5 中引入的一个新特性,提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型。

泛型的本质是把参数的类型参数化,也就是所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中。

为什么要使用泛型?

(1)保证了类型的安全性:泛型约束了变量的类型,保证了类型的安全性。例如List<int>和ArrayList。List<int>集合只能加入int类型的变量,ArrayList可以Add任何常用类型,编译的时候不会提示错误。

(2)避免了不必要的装箱、拆箱操作,提高程序的性能:泛型变量固定了类型,使用的时候就已经知道是值类型还是引用类型,避免了不必要的装箱、拆箱操作

如果不使用泛型,有什么缺点?

 第一个问题是性能。在使用值类型时,必须boxing & unboxing。装箱和取消装箱都会根据它们自己的权限造成重大的性能损失,但是它还会增加托管堆上的压力,导致更多的垃圾收集工作,而这对于性能而言也不太好。即使是在使用引用类型而不是值类型时,仍然存在性能损失,这是因为必须从 Object 向您要与之交互的实际类型进行强制类型转换,从而造成强制类型转换开销。

第二个问题(通常更为严重)是类型安全。因为编译器允许在任何类型和 Object 之间进行强制类型转换,所以您将丢失编译时类型安全。例如,以下代码可以正确编译,但是在运行时将引发无效强制类型转换异常:  

  

Java 基础 - 泛型

可以通过提供类型特定的(因而是类型安全的)高性能堆栈来克服上述两个问题。

1.泛型类

需要在类名称的后面,加一个尖括号<T>代表类型参数。

注意:在泛型类里的泛型方法,不必在泛型方法返回值前加上类型参数<T>。

           在非泛型类里的泛型方法,需要在泛型方法返回值前加上类型参数<T>。

2.泛型方法

注意:泛型方法体的类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。。

3.类型通配符<?>

<? extends T>表示该通配符所代表的类型是T类型的子类。

<? super T>表示该通配符所代表的类型是T类型的父类。

错误示范:

正确示范:

继续阅读