概述
泛型不但可用作用于整个类上,同时还可以作用于参数化方法.是否拥有泛型方法,与其所在类是否是泛型没有关系.
泛型方法使得该方法能够独立于类而产生变化,有一个基本原则:无能何时,只要你能做到,你就应该尽量使用泛型方法.
定义泛型方法:将泛型参数列表用尖括号括起来,放在返回值之前.
public class Method {
public void f(T t){
System.out.println(t.getClass().getName());
}
public static void main(String[] args) {
Method method = new Method();
method.f("123");
method.f(111);
method.f(new Method());
}
}
/*输入结果:
java.lang.String
java.lang.Integer
zhk.com.Method
*/
在上述例子中,我们可以像调用普通方法一样调用f(),就好像f()被无限次重载了意义.
注意:
在使用泛型类的时候,必须在创建对象的时候指定参数类型的值,但是使用泛型方法时通常不需要指明参数类型,因为编译器会为我们找出具体的类型,这称为参数类型推断.
在传入基本类型时,自动打包机制会接入,自动包装成对应的对象
static的方法而言,无法访问泛型类的类型参数,所以如果static方法需要使用泛型能力,必须使用其成为泛型方法
参数类型推断
Java SE7 引入了此机制,编译器根据特定的参数为我们找出具体的类型就是参数类型推断.下面是一个工具类,用来创建不同的容器对象:
public class CollectionUtils {
public static ArrayList newArrayList(){
return new ArrayList<>();
}
public static Map newHashMap(){
return new HashMap<>();
}
public static void main(String[] args) {
List stringList = CollectionUtils.newArrayList();
stringList.add("111");
List integerList = CollectionUtils.newArrayList();
integerList.add(1);
}
}
这个工具使用参数类型推断,避免了重复的泛型列表.
类型推断只对赋值操作有效,其他的时候并不起作用.如果将CollectionUtils.newArrayList()作为单数传递给另一个方法,编译器是不会执行参数类型推断的,它会认为返回了一个Object类型的变量.
显示的类型说明
因为上文中提到,类型推断只滴赋值操作有效,那么有没有其他的方式使其在非赋值操作,答案必须是有的,也就是显示的类型说明.使用方法是:
在点操作符于方法名之间插入尖括号,并且把类型放在尖括号内;
如果在定义改方法类的内部,必须在点操作符之前使用this关键字;
如果是使用静态方法,必须在点操作符之前加上类名;
public class CollectionUtils {
public static Map newHashMap(){
return new HashMap<>();
}
public static void main(String[] args) {
CollectionUtils.newHashMap().put(1,"dddd");
}
}