可以发现形如:ArrayList<String> list = new ArrayList<String>();
或者ArrayList<Integer> list = new ArrayList<Integer>();
或者ArrayList<Cat> list = new ArrayList<Cat>();
ArrayList(这个类的功能就是存储数据)是一个类,这个类后面的<>中可以添加任意的类型;ArrayList就是一个泛型类,通过ArrayList的源码发现,在定义ArrayList类的时候,其参数使用了E,即并不确定该类到底存储什么样类型的数据,,用了E暂时占着这个坑,做一个虚假的代表,表示ArrayList可以存储E类型的数据或E的子类类型的数据。
通过ArrayList这个泛型类的定义,可以结合E这个占坑的魔法字符,构建自己的泛型类。
1.NumGeneric类使用了<T>这种形式,表示类中的T可以代表任意类型的数据,从而使得该类为泛型类。这个类中的public T num;中T到底是什么类型的数据暂不确定,等到具体使用的时候,给他赋什么类型的数据,这个类型的数据就会替换掉T这个占坑符。
自然,不同于ArrayList类,NumGeneric类的功能并不是存储数据,但该类广泛的数据类型也体现了泛型类的特点。
public class NumGeneric<T>{
public T num;
public T getNum(){
return num;
}
public void setNum(T num){
this.num = num;
}
// 测试
public static void main(String[] aegs){
NumGeneric<Integer> intNum = new NumGeneric<Integer>();
intNum.setNum(10);
System.out.println(intNum.getNum());
NumGeneric<Float> floatNum = new NumGeneric<Float>();
floatNum.setNum(5.7f);
System.out.println(floatNum.getNum());
}
}
2.NumGenericTwo类,演示的是两个 <T,X>的形式。
public class NumGenericTwo<T,X> {
private T num1;
private X num2;
public void genNum(T num1,X num2){
this.num1 = num1;
this.num2 = num2;
}
public T getNum1() {
return num1;
}
public void setNum1(T num1) {
this.num1 = num1;
}
public X getNum2() {
return num2;
}
public void setNum2(X num2) {
this.num2 = num2;
}
// 测试
public static void main(String[]args){
NumGenericTwo<Integer,Float> numObj = new NumGenericTwo<>();
numObj.genNum(25, 6.8f);
System.out.println(numObj.getNum1()+" "+numObj.getNum2());
}
}
注:
(1)具体为什么需要自定义泛型类,还不清楚,以前也没有遇到过,等得到具体业务场景使用时,可能会加深理解;