泛型是一种未知的数据类型,可看成是变量,用来接收数据类型。
E e
:Element
元素
T t
:Type
类型
创建集合对象的时候,就会确定泛型的数据类型:
ArrayList<String> list = new ArrayList<String>();
创建集合对象,不使用泛型:
集合默认为Object
类型,可以存储任意对象,但不安全,会引发异常;
创建集合对象,使用泛型:
避免类型转换的麻烦,存什么类型,取得时候就是什么类型,把运行期异常(代码运行后会抛出的异常),提升到了编译期;泛型是什么类型,只能存什么类型。
1. 泛型的定义和使用:
(1) 类
创建对象的时候确定泛型。
格式:
修饰符 class 类名<代表泛型的变量>{
}
(2) 方法
含有泛型的方法,在调用方法的时候确定泛型的数据类型,传递什么参数,泛型就是什么类型。
格式:
修饰符<泛型> 返回值类型 方法名(参数列表(使用泛型)){
//方法体
}
(3)接口
格式:
修饰符 interface 接口名<代表泛型的变量>{}
2. 泛型的通配符
当使用泛型类或者接口时,传递参数中,泛型类型不确定,可通过通配符<?>
表示,但一旦使用泛型的通配符后,只能使用Object
类中的共性方法,集合中元素的自身方法无法使用。
?
:代表任意的数据类型
使用方式:
不能创建对象使用;
只能作为方法的参数使用;
泛型上限限定: ? extends E 代表使用的泛型只能是E类型的子类/本身;
泛型下限限定: ? super E 代表使用的泛型只能是E类型的父类/本身。
类与类的继承关系:
Integer extends Number extends Object
String extends Object