为了让方法可以操作不同类型的数据,而且类型不确定,可以将泛型定义在方法上。
1. 定义格式:
权限修饰符 <类型形参> 返回值类型 方法名(参数){...}
只有在修饰符和返回值类型之间用 <类型形参> 声明的方法才是泛型方法,使用泛型类或泛型接口的泛型的方法不一定是泛型方法。
在方法返回值类型前面声明的类型形参,只能在当前方法中使用,用于表示形参的类型、返回值类型或方法局部变量的类型,与泛型方法所属的类或接口无关,与其他方法无关,可以是静态的,也可以是非静态的。
泛型方法能独立于类而产生变化。
静态方法不能使用泛型类、泛型接口的泛型,所以,如果static修饰的方法要使用泛型能力,必须使其成为泛型方法。
2. 泛型方法使用
2.1 非静态泛型方法
public class MyGenericClass<T> {
// 非泛型方法:此方法上的泛型T,使用的是类上定义的泛型,不是方法上自己定义的
public void show(T t) {
System.out.println(t);
}
//泛型方法: 方法上自己定义的泛型
//数组转集合
public <E> List<E> arrayToList(E[] array){
ArrayList<E> list = new ArrayList<>();
for(E e : array){
list.add(e);
}
return list;
}
}
调用方法时,确定泛型的类型
public class GenericMethodDemo {
public static void main(String[] args) {
// MyGenericClass类的泛型指定为String并创建对象
MyGenericClass<String> gc = new MyGenericClass<>();
gc.show("abc");
//gc.show(200); //错误,show方法使用类上定义的泛型,已经指定为String,不能传递其它类型
MyGenericClass<String> gc2 = new MyGenericClass<>();
Integer[] nums = new Integer[]{25, 12, 36};
List<Integer> intList = gc2.arrayToList(nums);
System.out.println(intList);
String[] strs = new String[]{"aaa", "bbb", "ccc"};
List<String> strList = gc2.arrayToList(strs);
System.out.println(strList);
}
}
运行结果:
abc
[25, 12, 36]
[aaa, bbb, ccc]
2.2 静态泛型方法
public class MyGenericClass2 {
// 泛型方法
public static <T> T show(T t) {
System.out.println("泛型方法执行了...");
return t;
}
// 泛型方法,将数组中的元素添加到集合中
public static <E> void addToList(E[] array, Collection<E> coll) {
for (E e : array) {
coll.add(e);
}
}
}
调用方法时,确定泛型的类型
public class GenericMethodDemo2 {
public static void main(String[] args) {
String str = MyGenericClass2.show("abc");//指定泛型类型为String
System.out.println(str);
Integer num = MyGenericClass2.show(150);//指定泛型类型为Integer
System.out.println(num);
Integer[] array = new Integer[]{25, 12, 36};
Collection<Integer> coll = new ArrayList<>();
MyGenericClass2.addToList(array, coll);
System.out.println(coll);
}
}
运行结果:
泛型方法执行了…
abc
泛型方法执行了…
150
[25, 12, 36]
2.3 泛型可变个数形参
例如:Collections工具类中向集合添加元素方法:
public static <T> boolean addAll(Collection<T> c, T... elements)
:往集合中添加一些元素。
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
//原来写法
//list.add(12);
//list.add(14);
//list.add(15);
//list.add(1000);
//采用工具类 完成 往集合中添加元素
Collections.addAll(list, 5, 222, 1,2);
System.out.println(list);
}