java 泛型


java 的泛型就是c++中的模板类。目的就是解类型装换所花费的编程时间,使一种程序适配更多的类型

为什么要用泛型

   public class ArraryList{
        private Object[];
        public Object get(int i){}
        public void add(Object o){}
    }

上面是一个非常简单的数组类,get每次返回的是Object,我们一般都要转换成存入的类型。

		ArrayList arraylist=ArrayList();
		String string=(String)arraylist.get(0);
		arraylist.add(new File("...."));

如上面所示,不同类型的去除转换时非常麻烦的,而且还不安全。所以java 引入了类型参数(type parameter)来完成泛型编写解决此问题

定义泛型类

以下是一个见到那的泛型类

public class Pair<T>{
	private T first;
	private T second;
	
	public Pair() {
		this.first=null;
		this.second=null;
	}

	public Pair(T first, T second) {
		super();
		this.first = first;
		this.second = second;
	}

	public T getFirst() {
		return first;
	}

	public void setFirst(T first) {
		this.first = first;
	}

	public T getSecond() {
		return second;
	}

	public void setSecond(T second) {
		this.second = second;
	}
	
}

我们可以使用

Pair<String> p= new Pair()

通配符(wildcard type)

定义泛型函数


public class ArrayAlg {
	public static<T> T getWiddle(T...a)
	{
		return a[a.length/2];
	}

}

定义符号<T>要放在修饰符(public static)之后 返回类型T之前

		
	String middle=ArrayAlg<String>.getMiddle("123","Q","public")
	String middle=ArrayAlg.getMiddle("123","Q","public")
	String middle=ArrayAlg.getMiddle(3.14,0,1)
		

注意第三种方法会保持,因为传入了一个double 和两个intger,编译器不知道转换成那个

变量类型的限定

public class ArrayAlg {
	public static<T extemds Comparable>T min(T[] a){
		if (a==null|| a.length==0)
		return null;
		T smllest=a[0];
		for(int i=1;i<a.length;i++)
			if(smllest.compareTo(a[i])>0)smallest=a[i];
		return smallest;
	}	
}

<T extemds Comparable> 可以防止smallest 没有compareTo方法。

泛型代码和虚拟机

对于虚拟机来说不存在泛型代码。虚拟即会把泛型代码变不同类。虚拟机会擦除类型变量,替换成限定类型(没有限定使用Object)


public class Pair {
	private Object first;
	private Object  second;
	
	public Pair() {
		this.first=null;
		this.second=null;
	}

	public Pair(Object  first, Object  second) {
		super();
		this.first = first;
		this.second = second;
	}

	public Object  getFirst() {
		return first;
	}

	public void setFirst(Object  first) {
		this.first = first;
	}

	public Object  getSecond() {
		return second;
	}

	public void setSecond(Object  second) {
		this.second = second;
	}
	
}

约束和局限性

不能用基本类型实例话类型参数

不饿能使用

Pair<double>
Pair<Double>

Double的可以,因为类型擦除之后时接受Object类型的参数,而基本类型如double是不能赋值给Object的

##运行时类型查询只适用原始类型

if(a instanceof Pair<String>)
if(a instanceof Pair<T>)	

类型餐厨之后,都是一样的

Pair<String> stringPair=;
Pair<Eployee> employeePair=;
if(StringPair.getClass())==employeePair.getClass())

类型擦胡之后都是一样的

。。。。未完待续

泛型类型的继承关系

Parent 和Children是子类关系,但是Pair<Parent>和<\Children>没有任何关系

统配符类型

<Children>是<? extends Parent>的子类
<?extends Children>所有children的超类

<?>等价于 <? extends Object>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值