您的位置:首页 > 编程语言 > Java开发

Java泛型--泛型方法

2016-01-12 00:00 459 查看
Java泛型--目录

概述

泛型不但可用作用于整个类上,同时还可以作用于参数化方法.是否拥有泛型方法,与其所在类是否是泛型没有关系.

泛型方法使得该方法能够独立于类而产生变化,有一个基本原则:无能何时,只要你能做到,你就应该尽量使用泛型方法.

定义泛型方法:将泛型参数列表用尖括号括起来,放在返回值之前.

public class Method {

public <T> 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 <T> ArrayList<T> newArrayList(){
return new ArrayList<>();
}

public static <K,V> Map<K,V> newHashMap(){
return new HashMap<>();
}

public static void main(String[] args) {
List<String> stringList = CollectionUtils.newArrayList();
stringList.add("111");

List<Integer> integerList = CollectionUtils.newArrayList();
integerList.add(1);
}
}

这个工具使用参数类型推断,避免了重复的泛型列表.
类型推断只对赋值操作有效,其他的时候并不起作用.如果将CollectionUtils.newArrayList()作为单数传递给另一个方法,编译器是不会执行参数类型推断的,它会认为返回了一个Object类型的变量.

显示的类型说明

因为上文中提到,类型推断只滴赋值操作有效,那么有没有其他的方式使其在非赋值操作,答案必须是有的,也就是显示的类型说明.使用方法是:

在点操作符于方法名之间插入尖括号,并且把类型放在尖括号内;

如果在定义改方法类的内部,必须在点操作符之前使用this关键字;

如果是使用静态方法,必须在点操作符之前加上类名;

public class CollectionUtils {

public static <K,V> Map<K,V> newHashMap(){
return new HashMap<>();
}

public static void main(String[] args) {
CollectionUtils.<Integer,String>newHashMap().put(1,"dddd");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 泛型 泛型方法