java 泛型

1.泛型类

  泛型类的定义:<T>,可以有多个参数,用“,”分割,如:<T,K>。

/**
 * 泛型
 * @author Frank
 *
 * @param <T>
 */
public class Parent<T> {
	
	T data;

	public void setData(T data) {
		this.data=data;
	}
	
	public T getData() {
		return data;
	}
	
	/**
	 * 泛型类的实例化
	 */
	public static void test() {
		Parent<String> parent=new Parent<>();
	}
}

2.泛型方法

   在返回类型前面加上泛型类型的表示符

public class Utils {
	
	/**
	 * 泛型方法的 示例
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static <T> boolean compare(T d1,T d2) {
		
		return d1.getClass()==d2.getClass();		
	}


	/**
	 * 泛型方法的 泛型的范围限定 示例
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static <T extends Comparable<T>> boolean compare(T d1,T d2) {
	
	 return d1.compareTo(d2)==1;
	}


}

3.继承泛型类

	/**
	 * 泛型父类
	 * @author Frank
	 *
	 * @param <T>
	 */
	public class Parent<A,B> {

		A a;
		
		B b;

		public void setA(A a) {
			this.a = a;
		}

		public void setB(B b) {
			this.b = b;
		}
	}


    /**泛型类的继承示例**/

	/**
	 * 全部保留 父类的泛型
	 * @author Frank
	 *
	 * @param <A>
	 * @param <B>
	 */
	class P1<A, B> extends Parent<A, B>{
		@Override
		public void setA(A a) {
			// TODO Auto-generated method stub
			super.setA(a);
		}
		
		@Override
		public void setB(B b) {
		// TODO Auto-generated method stub
		super.setB(b);
		}
	}
	
	/**
	 * 部分保留父类的泛型
	 * @author Frank
	 *
	 * @param <A>
	 */
	class p2<A> extends Parent<A, Integer>{
		@Override
		public void setA(A a) {
			// TODO Auto-generated method stub
			super.setA(a);
		}
		@Override
		public void setB(Integer b) {
			// TODO Auto-generated method stub
			super.setB(b);
		}
	}

	/**
	 * 全部具体类型并扩展
	 * @author Frank
	 *
	 * @param <C>
	 */
	class p3<C> extends Parent<Integer, Integer>{
		C c;
		
		@Override
		public void setA(Integer a) {
			// TODO Auto-generated method stub
			super.setA(a);
		}
		@Override
		public void setB(Integer b) {
			// TODO Auto-generated method stub
			super.setB(b);
		}
		
		public void setC(C C) {
			this.c=c;
		}
	}
	
	/**
	 * 类型擦除 父类的泛型变成Object
	 * @author Frank
	 *
	 */
	class p4 extends Parent{
		@Override
		public void setA(Object a) {
			// TODO Auto-generated method stub
			super.setA(a);
		}
		@Override
		public void setB(Object b) {
			// TODO Auto-generated method stub
			super.setB(b);
		}
	}

4.通配符

<? super T>表示?为T的父类;<? extends T>表示?为T的子类。

<? super T> :可以写,因为?对应为T 的父类;不能读数据,因为不能确定,读取的?是那种类型。

<? extends T> 可以读,因为读取的是T类型;不能写数据,因为不能确定,?所对应的是哪个子类。

注:请记住PECS原则:生产者(Producer)使用extends,消费者(Consumer)使用super。

生产者使用extends:如果你需要一个列表提供T类型的元素(即你想从列表中读取T类型的元素),你需要把这个列表声明成<? extends T>,比如List<? extends Integer>,因此你不能往该列表中添加任何元素。

消费者使用super:如果需要一个列表使用T类型的元素(即你想把T类型的元素加入到列表中),你需要把这个列表声明成<? super T>,比如List<? super Integer>,因此你不能保证从中读取到的元素的类型。

即是生产者,也是消费者:如果一个列表即要生产,又要消费,你不能使用泛型通配符声明列表,比如List<Integer>。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值