JAVA 泛型的相关知识点

/*
 * 泛型分为:   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];
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值