泛型的作用:
定义一个泛型类 , 只需在类名后用尖括号将E/T括起来 , 其中E/T都可以 , 本质上是一个占位符 , 意思是先不指定这个动态数组的类型 , 待将来使用时 , 按需指定.
需求 : 假设定义一个学生类,类中有一个学号属性,且该属性即可能是int,还可能是String(忽略逻辑硬伤) , 无论外界传入的int还是String , 该类都要正确地接收
public class Student {
/** private int stuNum;
public int getStuNum() {
return stuNum;
}
public void setStuNum(int stuNum) {
this.stuNum = stuNum;
}
**/
private String stuNum;
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
}
若定义为int , 则在别处调用set方法赋值时只能赋int
若定义为String , 则在别处调用set方法赋值时只能赋String
不能满足需求
解决方法1 :
直接把stuNum定义为Object:
public class Student{
private Object stuNum;
public Object getStuNum() {
return stuNum;
}
public void setStuNum(Object stuNum) {
this.stuNum = stuNum;
}
}
然而这种方法有巨大的缺陷 , Object可以包容所有的类型 , 这样每个Student的的stuNum所存储的东西各式各样 , 例如日期/String/int/,甚至对象都可以从存储进去 , 并且每个程序员之间并不知道对方定义的是什么类型 , 也不知道对方传了什么类型那么
解决方法2 : 泛型
将学生类定义为泛型
//将T看成一个占位符 , 即先不声明Student类的类型,
public class Student<T> {
//成员属性也是泛型 , 且与类同泛型
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
public class TestGeneric {
public static void main(String[] args) {
//将String替代占位符T,此时属性只能是String
Student<String> stringStudent = new Student<>();
stringStudent.setT("zhinengshiString");
//若实例化对象时也不声明类型,那么默认为Object类型
Student objectStudent = new Student<>();
}
}
需求: 在学生类中定义show方法 , 并且show方法可以接收多种类型的参数
public class Student {
public String show(String str){
return str;
}
public Integer show(Integer integer){
return integer;
}
}
public class TestGeneric {
public static void main(String[] args) {
Student student = new Student();
student.show("diaoyongString");
stude6nt.show(18);
}
}
但是这样做就稍显冗余了,例如 , 若show方法可以接受更多类型的数据呢?那show方法要写几个?
更实际的问题是,有些时候我们甚至不确定将来要往这个方法中传什么数据 ,总不能把所有数据类型全部写上吧?
解决方法 :泛型方法
//在普通类中定义泛型方法
/**
<T> 传入值采用泛型的方式
T: 返回值采用泛型的方式
show(T t) :参数列表
**/
public class Student {
public <T> T show(T t){
return t;
}
}
//在普通类中定义泛型方法
/**
<T> 传入值采用泛型的方式
void: 返回值为空
show(T t) :参数列表
**/
public class Student {
public <T> void show(T t){
return t;
}
}
测试类中传值:
public class TestMain {
public static void main(String[] args) {
Student student = new Student();
//根据实际传入的参数类型确定泛型方法show的参数类型
student.show("testString");
student.show(20);
}
}