/*
* 泛型分为: 1、泛型类
* 2、泛型接口
* 3、泛型方法
* -----》1、泛型类: 定义:class Test<T1,T2>{} //其中的T1,T2就是类中的成员变量或者方法会用到的变量类型
* 申请类对象时候:---》1、带具体的泛化类型:Test <Integer,String> a =new Test<>();
* ---》 2、不带具体的泛化类型:Test a = new Test();这种方案中的类对象会根据
* 接收的对象类型不同体现出不同的效果!!!!!!!!其实可以看出不指明具体类型
* 的泛型类好像使用更加的灵活,但是不能强制类型转换,不然容易出问题。
* TIPS:Test<Integer,Integer> 和 Test<Number,Number>一定是两个不同的东西!!同时泛型类型对象也不能用instanceOf
* 来进行类型的判断,否则会报错
*------》2、泛型接口:定义和泛型类基本差不多。interface Test<T>{ }
*
**************重点:泛型通配符:当我们在写一个方法的是否如:public T add(T a,T b){ }
*注意关键点在于我们在写参数的时候,单个参数的类型是可以写成泛型的 public static <T> T sum(T a,T b){}
*这时的参数是泛型的,根据传入不同进行解释。但是如果是传入的一个泛型类型的对象的时候,就不能写成
*public static void add(FX<Integer,String> a,FX<T1> b) //如左侧所示,第一个参数是正确的定义,第二个参数那样
*写是会报错的,那么这就带来了一个问题,泛型类型的方法不那么“泛型”,因为你都具体指定好了幻化成什么类型的参数
*那我还玩什么?这里就需要用到泛型通配符了。
*public static void add(FX<?,?> a,FX<?,?> b) ?就代表一个具体的类型,可以接受任意的类型,可以看成是Object
*
* ----》3、泛型方法:泛型方法:public static <T1,T2> T1 sum(T1 a,T2 b){} 在使用的时候直接和正常使用一样,该
* 方法会自动根据我们传入的参数类型进行响应的解释。特别注意在泛型类中定义的泛型方法,如我在这个sum方法中定义了
* T1和T2类型,我的泛型类可以不包含这两个类型,定义成<E>,这是不影响的。同时如果我还定义了一个泛型方法,该方法
* 的泛型指定变量也是<E>,那么这个<E>和类上的那个不是同一个东西。
*
* TIPS:静态泛型方法中不能使用类上的泛型参数变量
*
*
* TIPS:我们可以限制泛型泛化的上下边界,如我现在只想让一个类的子类泛化传入,那么可以采用:
* public void MySHow(FX<?extends Runnable,?extends Serializable> a)//这样传入的这两个泛型的类型只能是
* Runnable的子类和Serializable的子类。
*
* public <T extends Number> T showKeyName(Generic<T> container) //上下边界,必须一起出现,但是上界可以自己
* 单独出现。
*
* TIPS:泛型数组的定义时,我们不能生产一个确切的泛型类型数组如:
* FX<Integer,String> [] array = new FX<Integer,String>[10]; //这个是会报错的
* FX<?,?> [] array = new FX<?,?>[10]; //但是使用通配符的情况是可以的,使用的时候需要加强制转换。
*
*/
class FX<T1,T2>{
T1 a;
T2 b;
FX(){}
FX(T1 a,T2 b){
this.a = a;
this.b = b;
}
public void show() {
System.out.println("a:"+this.a+", b:"+this.b);
}
}
public class FanXinLearning {
//定义一个泛型类型的方法:
public static void add(FX<?,?> a,FX<?,?> b) {
a.show();b.show();
}
public static <T1,T2> T1 sum(T1 a,T2 b) {
return a;
}
public void MySHow(FX<?extends Runnable,?extends Serializable> a) {}
public static void main(String[] args) {
// TODO Auto-generated method stub
FX a = new FX("阮聪",23);
FX b = new FX(1,100);
FX c = new FX(3.1415,false);
List l = new ArrayList<>();
l.add(a);
l.add(b);
l.add(c);
l.forEach(var->((FX)var).show());
add(a,b);
System.out.println(sum(1,2));
// FX<Integer,String> [] array = new FX<Integer,String>[10];
FX<?,?> [] arraya = new FX<?,?>[10];
}
}