【黑马程序员】java基础_泛型

本文深入探讨了Java泛型的概念及其优势,详细解释了如何在集合框架中利用泛型确保类型安全,避免运行时ClassCastException,并减少强制转换的麻烦。通过示例代码演示了泛型在数组与集合中的实际应用,以及如何通过反射加入非指定类型的元素,同时解释了泛型的兼容性问题和类型参数的继承关系在泛型中的特殊处理。
摘要由CSDN通过智能技术生成


------- android培训java培训、期待与您交流! ----------


今天了解到了泛型这个概念,这是第一次接触这个词。


泛型是JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。


他的好处是
1,将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,这样更加安全。

2,避免了强制转换麻烦。


泛型格式:通过<>来定义要操作的引用数据类型。

通常在集合框架中很常见到泛型,只要见到<>就要定义泛型。其实<> 就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

其实<> 就是用来接收类型的。



当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

class GenericDemo 
{
	public static void main(String[] args) 
	{

		ArrayList<String> al = new ArrayList<String>();

		al.add("hahaha01");
		al.add("ahahah02");
		al.add("aaaaa03");

		Iterator<String> it = al.iterator();
		while(it.hasNext())
		{
			String s = it.next();

			System.out.println(s+":"+s.length());
		}
	}
}


数组中在建立的同时就会指定接收的类型,当接收到的数据不是指定类型是就会编译失败。而集合建立的时候却不会指定接受类型,这导致编译的时候不会出错,但是在运行的时候就有可能出错了,这是不安全的,所以,泛型的出现很好的弥补了这一点,让泛型指定集合的接受类型,这样的话,在接收到非指定类型的时候就会编译失败,以便程序员修改代码。


泛型:编译的时候保留泛型信息,编译之后的运行则会把泛型去掉(使两个对象有可能相等)

所以,当我们通过反射绕过编译过程直接对两个数组进行比较时,发现二者虽然带的类型参数不同,但最后却相等。

		ArrayList<Integer> al1 = new ArrayList<Integer>();
		ArrayList<String> al2 = new ArrayList<String>();
		
		al1.add(5);
		al1.add(3);
		al1.add(8);

		al2.add("5");
		al2.add("3");
		al2.add("8");
		
		System.out.println("al1class == al2class:" + (al1.getClass()==al2.getClass()));

还有就是虽然泛型确定了类型参数,但通过反射可以加入非指定参数的元素到其中:

		ArrayList<Integer> al1 = new ArrayList<Integer>();
		
		al1.add(5);
		al1.add(3);
		al1.add(8);

		al1.getClass().getMethod("add", Object.class).invoke(al1, "aba");
		System.out.println(al1.get(3));
		System.out.println("size = " + al1.size());
例如上面这段代码,集合原本带的类型参数是Integer,但是通过反射,向其中加入了“abc”这样的字符串

创建数组实例的时候不能用泛型,如:Vector<Integer> v[] = new Vector<Integer>[10];这样就是错误的
泛型的兼容性:Collection<String> c = new Vctor();会报警告,但是能通过
Collection c = new Vectro<String>();同样会警告,但是编译可以通过


泛型的参数类型不考虑类型参数继承关系,如:
Vector<String> v = new Vector<Object>();
Vector<Object> v = new Vector<String>();
虽然Object和String 类型是父子类关系,但是在泛型中的类型参数不考虑继承关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值