Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型方法
可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
泛型方法的规则
所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。
每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
Java代码实例
实例1
//使用泛型方法输出不同类型数组的元素
public class GenericsTest {
public static void printArray(E[] inputArray){ //泛型方法printArray
for (E element:inputArray){ //遍历数组
System.out.printf("%s ",element);
}
System.out.println();
}
public GenericsTest(){
Integer[] intArray = {1,2,3}; //申明一个整型数组
Double[] doubleArray = {1.11,2.22,3.33}; //申明一个双精度数组
Character[] charArray = {'A','B','C'}; //申明一个字符型数组
System.out.println("整型数组元素为:");
printArray(intArray); //将整型数组作为参数传递到泛型方法printArray
System.out.println("双精度数组元素为:");
printArray(doubleArray); //将整型数组作为参数传递到泛型方法printArray
System.out.println("字符型数组元素为:");
printArray(charArray); //将整型数组作为参数传递到泛型方法printArray
}
}
运行结果如下:
实例2
//使用有界的类型参数的泛型方法
public class GenericsTest2 {
public static >T maxnum(T x,T y,T z){ //比较3个元素的大小,返回最大值
T max = x; //假定x为最大值max
if(y.compareTo(max) >0) //y和max比较
max = y;
if(z.compareTo(max) >0) //z和max比较
max = z;
return max; //返回最大值
}
public GenericsTest2(){
System.out.printf("%d,%d,%d中最大的数是:%d\n",3,4,5,maxnum(3,4,5));
System.out.printf("%.1f,%.1f,%.1f中最大的数是:%.1f\n",3.33,4.44,5.55,maxnum(3.33,4.44,5.55));
System.out.printf("%s,%s,%s中最大的数是:%s","aaa","abc","ccc",maxnum("aaa","abc","ccc"));
}
}
运行结果如下:
实例3
//定义一个泛型类
public class GenericsTest3 {
private T t;
public void add(T t){ //定义设定值得方法
this.t = t;
}
public T get(){ //定义获取值的方法
return t;
}
}
public class Main {
public static void main(String args[]){
GenericsTest3 integerg =new GenericsTest3(); //申明一个整型泛型类对象
GenericsTest3 stringg =new GenericsTest3();//申明一个字符串泛型类对象
integerg.add(new Integer(3)); //设定整型对象的值
stringg.add(new String("泛型类")); //设定字符串对象的值
System.out.println("整型值为:"+integerg.get()); //获取整型的值
System.out.println("字符串值为:"+stringg.get()); //获取字符串的值
}
}
运行结果如下:
实例4
import java.util.ArrayList;
import java.util.List;
//类型通配符
public class GenericsTest4 {
public static void getData(List data){
System.out.println("列表中存在数据:"+data.get(0));
}
public GenericsTest4(){
List name =new ArrayList(); //定义一个字符串型list集合
List id =new ArrayList(); //定义一个整型list集合
List password =new ArrayList(); //定义一个number型list集合
name.add("admin"); //往集合添加元素
id.add(110);
password.add(123);
getData(name); //获取集合元素
getData(id);
getData(password);
}
}
运行结果如下:
实例5
import java.util.ArrayList;
import java.util.List;
//类型通配符+有界类型参数
public class GenericsTest5 {
public static void getData(List data){
System.out.println("列表中存在数据:"+data.get(0));
}
public static void getUperNumber(List data){
System.out.println("列表中存在数据:"+data.get(0));
}
public GenericsTest5(){
List name =new ArrayList(); //定义一个字符串型list集合
List id =new ArrayList(); //定义一个整型list集合
List password =new ArrayList(); //定义一个number型list集合
name.add("admin"); //往集合添加元素
id.add(110);
password.add(123);
//getUperNumber(name); //获取集合元素
getUperNumber(id);
getUperNumber(password);
}
}
运行结果如下: