一、泛型的定义
泛型
译为广泛的类型,不明确的类型,在定义的时候不用计较真正数据类型是啥,只需要通过一个字符(通常使用大写英文字母,例如:T
,
E
,
A
,
B
)来声明即可;在进行调用时传入真正的数据类型,泛型就会自动变为传递数据的数据类型;在
JDK 1.5
的时候添加的技术。
二、泛型的声明格式
泛型的声明格式:使用
<>
进行泛型的声明,然后再
<>
内用大写的英文字母表示泛型;泛型根据声明的位置不同,可分为泛型类,泛型方法;
泛型类
即是在声明类的同时声明泛型,该泛型在类中可以被使用;
泛型方法
是在声明方法时声明的泛型,只能在方法内使用;
例如集合的泛型使用:
Class TreeSet<E>{
}
其中
E
就是泛型,是一个不明确的类型,意味着在创建
TreeSet
容器时,可以指定一个具体的数据类型,也可以不指定;一旦指定,那么构建好的容器就只能存放该类型的数据;
再比如:
TreeSet<Integer> treeSet = new TreeSet<Integer>();
意味着,
treeSet
容器中只能存放
Integer
类型的数据;
注意:
针对集合,泛型只能是引用数据类型,不能是基本数据类型;
三、使用泛型的好处
①
泛型的声明是为了在声明时更加容易,在使用该结构时更加灵活多变;
②
泛型将遍历接受数据的处理逻辑提前化,
不需要进行强制类型转换
;
③
泛型可以
规范数据的数据类型,方便数据的统一处理
;
四、泛型类定义和使用
public class Person<T,E>{
//声明类的时候声明泛型
T name;
E age;
public T getName(){
return name;
}
public void setName(T name){
this.name =name;
}
public E getAge(){
return age;
}
public void setAge(E age){
this.age =age;
}
}
五、泛型方法的定义和使用
泛型方法的使用实际就是
替换以前的方法重载,减少同名方法的声明次数
;
注意:
普通方法能够使用类的泛型也可以使用方法中声明的泛型;静态方法只能使用方法中的泛型;
六、集合泛型的使用以及泛型的上下限
泛型使用最广泛的地方即是集合当中的使用,能够有效的规定约束集合的数据类型,避免数据的强制转换等问题。在使用集合时,即创建集合对象的时候要求必须使用泛型。
集合中使用泛型的格式:
集合类
<
数据类型
>/
接口
<
数据类型
>
对象
= new
集合类
();
七、泛型的上下限
上限:
<? extends Object>
其中 ? 也是泛型的一种表示方式,叫通用泛型 extends 表示继承
? extends Object 表示 ? 必须是
Object 的子类或者它本身。一般在存储元素时使用上限(? extends E)。因为一旦确定好类型,存入的就都是E或E的子类,取出时都按照上限类型E来运算,不会出现类型安全隐患。
下限:
<? super E>
<? super E>
表示
?
必须是
E
或者
E
的父类
受限泛型的下限泛型,一般只有使用比较器的时候用到。