<JDK1.5新特性>:1.函数泛型-
泛型方法:与泛型类型和C++中的函数模板相类似,就是将泛型定义在方法上。一个方法操作的引用数据类型不确定。
如下例:
1 package cn.edu.bupt1;
2
3 public class MainTest {
4 public static void main(String[] args) {
5 GenericMethod<String> gm = new GenericMethod<String>();
6
7 gm.show("hello,gm.show");
8 gm.show(18);
9
10 gm.print(new Integer(19));
11 gm.print("Hello,gm.print"); //illegal, because of <Q extends Number>
12
13 gm.show2("Hello,gm.show2, age = ", new Integer(20)); //care
14
15 GenericMethod.print2(3.14159); //recommended√
16 gm.print2("again, in print2 Method"); // not recommended×
17 }
18 }
19 class GenericMethod<T> {
20 public <F> void show(F str) {
21 System.out.println(str);
22 }
23
24 public <Q extends Number> void print(Q str) {
25 System.out.println(str);
26 }
27
28 public <D> void show2(T str1, D str2) {
29 System.out.println(str1.toString() + str2.toString());
30 }
31
32 public static <P> void print2(P str) {
33 System.out.println(str);
34 }
35 }
解释:
1、当成员方法是泛型的时候,不需要为泛型方法传入具体的类型参数,编译器会根据你传入的实参自动
初始化泛型中的类型,例如第7行,因为传入的变量是字符串类型,因此编译器自动将泛型类型F初始化为
String类型;但是这个类型F并不是永久为String类型,在下一次传入参数的时候又会变化为与之相匹配
的参数类型,如第8行,此时F变成int类型。
2、也可以使用extends或super关键字限制传入参数类型为某类的子类或父类,如第10和11行。
3、当成员方法是非static成员时,方法内部可以使用自己的泛型类型,也可以使用所属泛型类指定的
类型,如第13行,不同之处是泛型类中的类型参数通过具体指定在实例化成为对象的时候就确定具体类型,
但是方法中的类型参数只有当再调用传入实参时才能隐式确定其具体类型。如show2第一个参数在第5行
确定为String类型,如果不是String类型参数则编译错误,但是第二个参数可以为任何类型,传入什么类型
的参数D就指定为什么类型,如上例,为Integer类型。
4、静态方法不可以使用类上定义的泛型,因为类上的泛型只有建立对象时才被明确。所以静态方法要使
用泛型必须定义在方法上。泛型要定义在static关键字之后。
使用静态方式调用其静态方法的格式是:
类名(不加类型参数).static成员方法(参数)
通过实例引用静态方法并不推荐。
具体请参见:http://docs.oracle.com/javase/tutorial/extra/generics/methods.html
浙公网安备 33010602011771号