Generic泛型

泛型:JDK1.5之后的新特性,用于解决安全问题,是一个安全机制

好处:将运行时期出现问题classCastException转移到了编译时期

避免了强制转换的麻烦

package com.itheima;

class Utils<QQ> {
	private QQ q ;
	public void setObject(QQ q){
		this.q = q;
		
	}
	public QQ getObject(){
		return q;
	}
}

package com.itheima;

public class GenericDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Utils<Worker> u = new Utils<Worker>();
		u.setObject(new Worker());
	//	u.setObject(new Student());
		Worker w = (Worker)u.getObject();//不用强转
		Worker w1 = u.getObject();
	}

}

package com.itheima;

public class Worker {

}


当类中要操作的引用数据类型不确定的时候,早起定义Object来完成扩展。现在定义泛型来完成扩展。

特殊之处:

静态方法不可以访问类上定义的泛型。

如果静态方法操作的英勇数据不确定,可以将泛型定义在方法上

-----------------------------------------------------------

没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,

集合中只能存储同一个类型的对象。这样更安全,并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换

package com.itcast.day1;

import java.lang.reflect.Constructor;
import java.util.ArrayList;

public class GenericTest {

	public static void main(String[] args) throws Exception{
	
/*		ArrayList collection1 = new ArrayList();
		collection1.add(1);
		collection1.add(1L);
		collection1.add("abc");
		int i = (Integer)collection1.get(1);*/
		
		ArrayList<String> collection2 = new ArrayList();
		//	collection1.add(1);
		//	collection1.add(1L);
			collection2.add("ab");
			collection2.add("abcd");
			String element = collection2.get(1);
			
//			new String(new StringBuffer("abc"));用StringBuffer对象传给String这个构造方法,然后再new出一个实例对象
			Constructor<String> constructor1 = String.class.getConstructor(StringBuffer.class);//反射的方式实现,得到Constructor类型的对象;靠参数类型识别哪一个构造方法,(运行的时候才执行这行代码,在翻译的时候只是语法检查)
//			constructor1.newInstance(initargs);//字节码的对象,编译时到底对应String哪一个构造方法,不知道,
			constructor1.newInstance(new StringBuffer("abc"));
			//第一个StringBuffer是选择哪个构造方法;第二个是表示用这个构造方法的时候,传一个StringBuffer的对象进去
//			String str2 = constructor1.newInstance(new StringBuffer("abc"));//编译时不知道是谁的构造方法
			String str2 =constructor1.newInstance(/*"abc"//这是String类型*/new StringBuffer("abc"));
			System.out.println(str2);
			
			ArrayList<Integer> collection3 = new ArrayList<Integer>();
			System.out.println(collection3.getClass()==collection2.getClass());
			
			//反射操作,在编译之后添加其他类型的参数;因为1.5的自动装箱功能,1就是Integer
			collection3.getClass().getMethod("add", Object.class).invoke(collection3, "aaa");
			System.out.println(collection3.get(0));
	}

}

----------------------------------------

泛型中的?通配符

	Class<?> y;
			Class<String> x ;//Class.forName("java.lang.String");
			/*		y=x;
			x=y;*/


综合案例

//	对HashMap进行迭代操作,取出每个元素,打印出每个元素的key和value
	HashMap<String,Integer> maps = new HashMap<String,Integer>();
	maps.put("PY", 18);
	maps.put("Jack", 23);
	maps.put("Aimee", 22);
	//Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类( Map.Entry<K,V>)
//	Map不能直接迭代,只有把map变成set,因为set实现了接口 Iterable<T>
//Set里面的泛型 又是一个参数化类型
	Set<Map.Entry<String,Integer>> entrySet = maps.entrySet() ;
	for(Map.Entry<String, Integer> entry:entrySet){
		System.out.println(entry.getKey() + ":" + entry.getValue());
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值