3.0、Java泛型 - 泛型方法
语法如下->
修饰符<T,E,...>返回值类型 方法名(形参列表) {
方法体...
}
1、public 与返回值中间 <T>(也就是泛型列表) 非常重要,可以理解为声明此方法为泛型方法;
2、只有声明了 <T> 的方法才是泛型方法,泛型类中使用了泛型的成员方法并不是泛型方法;[ 成员方法在调用时不需要指定类型,而在调用泛型方法的时候需要指定数据类型 ]
3、<T> 表明该方法将使用泛型的类型T ,此时才可以在方法中使用泛型类型T;
4、与泛型类的定义一样,此处 T 可以随便写为任意标识,常见的如 T、E、K、V 等形式的参数常用于标识泛型;
[ 注意:
当成员方法用到泛型类的标识符时,不能将该成员方法定义为静态方法;因为静态方法和类同时加载,此时类还没有初始化也就还没有指定数据类型,所以此时的静态方法中的泛型还没有指定类型,所以编译报错;
但是如果是泛型方法的话,Java规定->可以用 static 关键字修饰;]
泛型方法在调用时才会指定类型:
创建一个 Test.java 类型 ->
public class Test { //写一个方法testMethod泛型列表为 <E> //返回值为 E //ArrayList<E> E至少需要和泛型列表中的一个标识保持一致 public <E> E testMethod(ArrayList<E> list) { return list.get(0); } }
在 main() 方法中调用 testMethod() 方法 并指定类型为 String ->
public static void main(String[] args) { List<String> strList = new ArrayList<String>(); list.add("字符串类型"); Test t = new Test(); t.testMethod(strList); }
当泛型方法和泛型类的表示符相同时 ->
public class Test<E> { public <E> E testMethod(ArrayList<E> list) { return list.get(0); } }
public static void main(String[] args) { List<String> strList = new ArrayList<String>(); list.add("字符串类型"); Test<Integer> t = new Test<Integer>(); t.testMethod(strList); }
当泛型方法定义的标识符与他自己的泛型类一致时,不会相互影响,就算在初始化类的时候指定类型为 Integer ,在调用方法时指定泛型方法的类型为 String 那么在调动方法的时候类型依然是 String 而不是 Integer;
泛型方法与可变参数
定义语法 ->
public <E> void print(E... e) {
for(E e1 : e) {
System.out.println(e);
}
}
总结一下:
泛型方法能使方法独立于类而产生变化,所以我们在工作中能够用泛型方法解决的问题,尽量就不要再去定义泛型类了,泛型方法比起泛型类来说更为灵活多变;