理解Java 泛型(一)

一、泛型概念的提出

首先来看下面一个简单的栗子:

public class Test1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List list = new ArrayList();
		
		list.add("abc");
		list.add("edf");
		list.add(55);
		
		for(int i=0;i<list.size();i++){
			String temp = (String) list.get(i);
			System.out.println(temp);
		}
	}
}


看一下输出:

abc
edf
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at demo.Test1.main(Test1.java:22)

可以看出,在输出55的时候报错 :ClassCastException(),类型转换错误,通常是“当前者的域小于后者的域时候出现 ”,例如前者A是子类的对象,而后者B是父类的对象。若A=B,则会抛出该错误。

再仔细看看代码:

定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似ClassCastException()的错误。编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。

通过以上的栗子可以看到,在将字符串装入集合时,编译时无法自动识别错误,但是在取出它时会报错;还有在取出时,需要强制转换类型!

那么有什么办法使得集合记住自己装入的类型,从而阻止其他类型继续装入呢?答案就在“泛型”。

二、什么是泛型?

泛型,即“参数化类型”。具体来说就是,原来在定义变量、方法、类时使用的int ,String,void等进行“参数化”,原来具体的类型现在成为了不确定的。类似于在定义方法时会传入形参,而在调用方法时传入实参。

把上面的栗子采用泛型改写如下:

public class Test1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List <String> list = new ArrayList();
		
		list.add("abc");
		list.add("edf");
//		list.add(55);  // 编译错误
		
		for(int i=0;i<list.size();i++){
			String temp = list.get(i);
			System.out.println(temp);
		}
	}
}


在上面 Code中,加入1个integer类型的数据 55 时会提示编译错误,这是因为在List<String>中限定了加入的元素只能是String 类型的。这样在取出元素时,就不需要进行强转,因为加入的时候就已经确定好了。

泛型不仅有泛型参数,泛型类,还有泛型方法!看以下的栗子:

public class Test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Gen<String> gen = new Gen<String>("abc");
		gen.showType();
		System.out.println("o=="+(gen.getData()));
	}
}

class Gen<T>{
	private T o;
	
	public Gen(T a){
		o=a;
	}
	//泛型方法
	public T getData(){
		return o;		
	}
	
	//显示o的类型
	public void showType(){
		System.out.println("类型是:"+o.getClass().getName());
	}
}

泛型的主要好处在于:在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值