在学习java的过程中,我们常常会遇到泛型方法,泛型方法使得该方法能独立于类而产生变化。下面,我们可以写一个泛型方法,使其方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
以下是一个基本的指导原则:
无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。另外,对于一个static的方法而言,无法访问泛型类的类型参数。所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
下面是定义泛型方法的规则:
1)所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的
2)每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
3)类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
4)泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
下面举一些泛型方法的示例:
/**
* public 与 返回值中间
* 只有声明了
*
* 与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
*/
public class GenericMethods {
public
System.out.println(t.getClass().getName());
}
public
IllegalAccessException {
T t = tClass.newInstance();
return t;
}
public static
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
}
}
说明一下,定义泛型方法时,必须在返回值前边加一个
泛型类是在实例化类的时候指明泛型的具体类型,而泛型方法是在调用方法的时候指明泛型的具体类型 。
泛型方法可以在任何地方和任何场景中使用,但是有一种情况是非常特殊的,当泛型方法出现在泛型类中时,我们再通过一个例子看一下:
/**
* 这是一个泛型类
*/
class GenericClassDemo
/**
* 这个不是泛型方法,只是使用了泛型类中已声明的T
*/
public void show1(T t){
System.out.println(t.toString());
}
/**
* 泛型方法,使用泛型E,这种泛型E可以为任意类型。可以类型与T相同,也可以不同。
* 由于下面的泛型方法在声明的时候声明了泛型
* 编译器也能够正确识别泛型方法中识别的泛型。
*/
public
System.out.println(e.toString());
}
/**
* 在泛型类中声明了一个泛型方法,使用泛型T,注意这个T是一种全新的类型;
* 可以与泛型类中声明的T不是同一种类型。
*/
public
System.out.println(t.toString());
}
}
泛型方法和可变参数
泛型方法与可变参数列表能很好地共存:
public class GenericMethodTest {
public
for(T t : args){
System.out.print(t + " ");
}
}
public static
List
for(T item:args)
result.add(item);
return result;
}
public static void main(String[] args) {
GenericMethodTest gmt = new GenericMethodTest();
gmt.printArgs("A","B"); // A B
List ls = GenericMethodTest.toList("A");
System.out.println(ls); // [A]
ls = GenericMethodTest.toList("A","B","C");
System.out.println(ls); // [A,B,C]
}
}
静态方法使用泛型
静态方法无法访问类上定义的泛型,如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。即:如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方法 。
public class GenericTest
/**
* 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明
* 即使静态方法不可以使用泛型类中已经声明过的泛型(需将这个方法定义成泛型方法)
* 如:public static void genericMethod(T t){..},此时编译器会提示错误信息:
* "StaticGenerator cannot be refrenced from static context"
*/
public static
// ...
}
}
填写下面表单即可预约申请免费试听java课程!害怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
一级建造师二级建造师消防工程师造价工程师土建职称房地产经纪人公路检测工程师建筑八大员注册建筑师二级造价师监理工程师咨询工程师房地产估价师 城乡规划师结构工程师岩土工程师安全工程师设备监理师环境影响评价土地登记代理公路造价师公路监理师化工工程师暖通工程师给排水工程师计量工程师
执业药师执业医师卫生资格考试卫生高级职称护士资格证初级护师主管护师住院医师临床执业医师临床助理医师中医执业医师中医助理医师中西医医师中西医助理口腔执业医师口腔助理医师公共卫生医师公卫助理医师实践技能内科主治医师外科主治医师中医内科主治儿科主治医师妇产科医师西药士/师中药士/师临床检验技师临床医学理论中医理论