前面的所有泛型操作都是将整个类进行泛型化,但同样也可以在类中定义泛型化的方法。
泛型方法的定义与其所在的类是否是泛型类是没有任何关系的。
一、定义泛型方法
在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型:
[访问权限] <泛型标识> 泛型标识 方法名称([泛型标识 参数名称])
class Demo{
public <T> T fun(T t){//可以接收任意类型的数据
return t;
}
}
public class Test{
public static void main(String[] args) {
Demo d = new Demo();
String str = d.fun("Java");//传递字符串
int i = d.fun(30);//传递数字,自动装箱
System.out.println(str);
System.out.println(i);
}
}
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
程序中的 fun()
方法是将接收的参数直接返回,因为在方法接收参数中使用了泛型操作,所以此方法可以接收任意类型的数据,而且此方法的返回值类型将由泛型指定。
二、通过泛型方法返回泛型类实例
如果可以通过泛型方法返回一个泛型类的实例化对象,则必须在方法的返回类型声明处明确地指定泛型标识。
class Info<T extends Number>{//此处指定泛型只能是数字类型
private T var;//此变量的类型由外部决定
public T getVar(){//返回值的类型由外部指定
return var;
}
public void setVar(T var) {//设置的类型由外部指定
this.var = var;
}
public String toString(){//覆写 Object 类中的 toString() 方法
return this.var.toString();
}
};
public class Test{
public static void main(String[] args) {
Info<Integer> i = fun(30);//传递整数到 fun() 方法
System.out.println(i.getVar());
}
public static <T extends Number> Info<T> fun(T param){
Info<T> temp = new Info<T>();//根据传入的数据类型实例化 Info对象
temp.setVar(param);//将传递的内容设置到Info类中的var属性之中
return temp;//返回实例化对象
}
}
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
代码中的 fun() 方法在 static 关键字处定义了 <T extends Number>
,表明方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定。
三、使用泛型统一传入的参数类型
如果现在一个方法要求传入的泛型对象的泛型类型一致,也可以通过泛型方法指定
class Info<T>{
private T var;//此变量的类型由外部决定
public T getVar(){//返回值的类型由外部指定
return var;
}
public void setVar(T var) {//设置的类型由外部指定
this.var = var;
}
public String toString(){//覆写 Object 类中的 toString() 方法
return this.var.toString();
}
};
public class Test{
public static void main(String[] args) {
Info<Integer> i1 = new Info<Integer>();//设置 Integer为泛型类型
Info<Integer> i2 = new Info<Integer>();//设置 Integer为泛型类型
i1.setVar(3);
i2.setVar(4);
add(i1,i2);
}
public static <T> void add(Info<T> i1,Info<T> i2){
System.out.println(i1.getVar() + " -- " + i2.getVar());
}
}
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
这里 add 方法中的两个 Info对象的泛型类型必须一致,如果设置不一致,则在编译会出现错误