Java:泛型

泛型概述

 

JDK5以后, Java引入了“参数化类型(parameterized type)”的概念, 该概念也称之为泛型(Generic)。所谓泛型就是允许在定义接口、类或方法时使用类型形参,该类型形参将在声明变量、创建对象或者调用方法时动态指定(即传入实际的类型参数,可称为类型实参)。泛型的出现简化了代码,提高了程序的健壮性。

 

泛型接口

 

泛型接口,Java5改写了集合框架中的全部接口,下面以List和Map接口中的部分代码为例展示泛型接口的定义:

 

注:定义接口时指定一个类型形参E,在此处定义好后可在整个接口体中当做类型使用。

 

注:定义Map接口时指定了两个类型参数一个类型形参K,V,在此处定义好后可在整个接口体中当做类型使用

 

泛型类

 

泛型类,泛型不仅仅可以在定义接口是可以使用,定义类时同样可以使用,下面以Map接口实现类HashMap中的部分代码为例展示泛型类的定义:

 

 

定义实现了Map接口的实现类HashMap,在定义本类中使用了泛型形参。定义类时使用的泛型形参可以在整个类体中被使用

 

泛型方法

 

1.概念:泛型方法(Generic Method)指声明一个带有定义一个或多个类型形参的方法.

 

2.如何定义泛型方法:

 

 

注:如果定义的泛型方法有修饰符,则泛型方法中的类型形参列表必须放在方法返回值类型之前,修饰符之后;如果定义的泛型方法没有修饰符,则泛型方法中的类型形参列表必须放在方法返回值类型之前,访问控制符之后;

 

3.泛型方法中定义的类型形参只能在该方法中使用,而定义接口和类时定义的类型形参可以在整个接口和类中使用。

 

4.如何使用泛型方法:

 

注:与类和接口中使用泛型参数不同,使用泛型方法时无须为方法中定义的泛型参数显示传入实际类型参数,编译器会根据实际数据推断该泛型参数的实际类型

 

类型通配符

 

使用带有泛型类型的类、接口和方法时,如果无法判断其泛型类型,可以只用类型通配符?来代替。

 

注:由于无法判知List集合泛型,所以这里使用类型通配符代替。

 

注意:

1.类型通配符不能用于声明含有泛型的接口、类或方法

2.如果将类型通配符用于诸如集合泛型,则除null外不能像其中添加元素,只能遍历元素。

 

 

泛型上限

 

借助extends关键字可以设定泛型上限。

 

设定类型通配符上限:

 

注:通过extends限制了限制了类型通配符必须是Number类本身或其子类

 

注意:

1.这种为类型通配符设置上限的方式同样不能用于声明含有泛型的接口、类或方法

2.如果将这种类型通配符用于诸如集合泛型,则除null外不能像其中添加元素,只能遍历元素。

 

泛型下限

 

<? super Type>用于设定通配符的下限:此时通配符表示必须是Type自身或者是Type的父类。

 

注:决定了传入的类型实参必须是Integer类或其父类

 

泛型擦除

 

原始类型:使用带泛型声明的类、接口和方法时,如果不为该泛型参数指定实际的类型参数,则该类型参数被称作raw type(原始类型),此时默认实际类型为声明该类型参数时指定的第一个上限类型。

 

泛型擦除:当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有在尖括号之间的类型信息都将被扔掉,这一过程称之为泛型擦除。

 

注:编译器将丢失所创建的ArrayList集合对象中的泛型信息,此时集合泛型变成了Object

 

 

 

 

posted @ 2018-10-26 12:10  龙雪  阅读(174)  评论(0编辑  收藏  举报