一般的类和方法,只能使用具体的类,要么是基本类型,要么是自定义类型。如果要编写可以应用于多种类型的代码,就需要使用泛型。
在没有泛型的编程场景中,所有接口和方法的入参类型都是固定的,如果要使用其他类型的入参就需要做显式的强制类型的转换,而泛型是一个通用的类型解决方法,接口和方法入参并没有指定特定的类型,处理逻辑被封装在泛型或泛型方法内部,降低了程序运行时类型转换异常的风险。
泛型是jdk1.5引入的新特性,其本质是参数化类型,也就是说所操作的数据类型可以被指定一个参数,参数分别有泛型类、泛型接口和泛型方法。
泛型类
和正常类声明相似,泛型类的声明需要使用class关键字,但是不需要在类名后面添加类型参数声明。泛型类声明格式如下:
class[类名]<T>
其中,字母T表示泛型类型,它并没有指定特定的类型,可以是除了基本类型外的任何对象或接口。我们可以使用二十六个英文中的任意一个大写字母来表示泛型
public class workGeneric<T>{
private T name;
private List<T> desc;
public void setName (T name){
this.name=name;
}
public T getName() {
return name;
}
public void setDesc(List<T> desc) {
this.desc = desc;
}
public List<T> getDesc() {
return desc;
}
}
泛型类的类型参数声明可以包含多个类型参数,参数之间需要用逗号隔开
public class towGeneric<T,S,U> {
private T name;
private List<S> desc;
private U age;
}
泛型类型定义的类型,可以在类中用来定义成员属性或成员方法的返回值。实际使用时,可以使用具体的类型来替换泛型变量(如泛型类T),将泛型类对象实例化后进行操作
public class threeGeneric {
public static <T extends Comparable<T>> T max(T x,T y){
T max =x;
if(y.compareTo(max)>0)
max=y;
return max;
}
public static void main(String[] args) {
System.out.printf("%d和%d中最大的数为%d\n\n",10,11,max(10,11));
System.out.printf("%.1f和%.1f中最大的数为%.1f\n\n",1.3,1.4,max(1.3,1.4));
System.out.printf("%s和%s中最大的数为%s\n","red","blue",max("red","blue"));
}
}
泛型方法
我们可以定义泛型方法在调用时接收不同类型的参数。泛型方法定义格式如下:
[权限方法修饰符]<参数类型列表>返回值 方法名称([参数列表]);
泛型方法和其他方法的声明其实是一样的,需要注意类型参数只能是引用类型,而不是基本类型(如int、long、char等)
public class fourGeneric {
public <T> void toString(T t){
System.out.println("入参"+t+"包装类型为:"+t.getClass().getName());
}
public static void main(String[] args) {
fourGeneric fourGeneric = new fourGeneric();
fourGeneric.toString(1);
fourGeneric.toString(1.234);
fourGeneric.toString(Boolean.TRUE);
fourGeneric.toString("Java编程");
}
}