泛型的使用
1、使用:对于有泛型的类型,在这些类型后面跟上尖括号,尖括号里面写上泛型的确定类型(在使用某个类创建对象时,已经可以确定这个具体的类型了,那么就直接写出具体类型)
例如:
ArrayList<Integer> al = new ArrayList<Integer>();
注意事项:
1、前后一致:在创建对象时,赋值符号前面和后面的类型的泛型,必须一致
2、泛型推断:如果前面的引用所属的类型已经写好了泛型,后面创建对象的类型就可以只写一个尖括号,尖括号中可以不写任何内容。<>特别像菱形,称为“菱形泛型”,jdk1.7特性
泛型类的定义
带着泛型定义的类
格式:
class 类名<泛型类型1, 泛型类型2, …> {
}
1、类名后面跟着的泛型类型,是泛型的声明,一旦泛型声明出来,就相当于这个类型成为了已知类型,这个类型就可以在整个类中使用
2、泛型的声明名称,只需要是一个合法的标识符即可,但是通常我们使用单个大写字母来表示,常用字母:T、W、Q、K、V、E
3、泛型确定的时机:将来在使用和这个类,创建对象的时候
泛型方法的定义
格式:
修饰符 <泛型声明1, 泛型声明2,…> 返回值类型 方法名称(参数列表) {
}
1、在方法上声明的泛型,可以在整个方法中,当做已知类型来使用
2、如果【非静态】方法上没有任何泛型的声明,那么可以使用类中定义的泛型
3、如果【静态】方法上没有任何的泛型声明,那么就不能使用泛型,连类中定义的泛型,也不能使用,因为类中的泛型需要在创建对象的时候才能确定。所以【静态】方法想使用泛型,就必须在自己的方法上单独声明。
public static void main(String[] args) {
// 3. 测试带有泛型的静态方法功能
String[] arr = {"a","b","c","d"};
// W[] arr,int index1, int index2
FanXingMethod.changeArrayELe(arr,1,2);// [a, c, b, d]
Integer[] arr1 = {1,2,3,4,56};
FanXingMethod.changeArrayELe(arr1,1,2);// [1, 3, 2, 4, 56]
}
泛型的通配符
第一种形式,使用?来表示可以是任意类型,例如:
Collection接口中的removeAll(Collection<?> c),表示可以接收任意泛型类型的集合,作为该方法的实际参数,参数集合的泛型,可以是与E没有任何关系
第二种形式,使用? extends E来表示必须是某个泛型类型或是该泛型类型的子类,例如:
Collection接口中的addAll(Collection<? extends E> c),表示可以接收泛型类型是调用者泛型类型或者其子类的集合,作为该方法的实际参数。参数的泛型和调用者的泛型,必须有关(相同或者是子父类)。确定了泛型的上边界。
第三种形式,使用? super E来表示必须是某个泛型类型或者是该泛型类型的父类,例如:
Arrays工具类中,排序方法static void sort(T[] a, Comparator<? super T> c),T是该方法的泛型,T表示的是数组中元素的类型,<? super T>表示可以接收泛型类型是数组元素类型T或者是元素类型T的父类的比较器,作为sort方法的参数。参数的泛型和方法的泛型,必须有关(相同或者是子父类)。确定了泛型的下边界。
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
ArrayList<Integer> li = new ArrayList<>();
li.add(1);
li.add(2);
// 1. removeAll(Collection<?> c): 参数集合可以是任意泛型类型
// ? : 表示泛型的通配符,表示任意泛型类型
list.removeAll(li);
// 2. addAll(Collection<? extends E> c):
// 1) E泛型表示方法调用集合中具有的泛型类型--->list中的String类型
// 2) ? extends E : ? 表示的泛型需要是E类型本身或者是E类型的任意一个子类类型
// 3) 为什么限定 ? extends E, 方法是添加功能, 只有参数集合中的数据可以添加到list集合中才能让这个方法正常进行添加
// list.addAll(li);
ArrayList<Object> list2 = new ArrayList<>();
list2.addAll(list);
// 3. ? super T :
// sort(T[] arr,Comparator<? super T> c)
// ? 表示的泛型类型需要是T类型本身, 或者是T类型的父类类型
}