泛型的内部原理与应用

一、下面是说明泛型的基本原理与代码的应用

/**
		 * 利用反射就可以不用把StringBuffer装换成String,因为构造器知道是存放的是String类型
		 */
		Constructor<String> constructor1 = String.class.getConstructor(StringBuffer.class);
		String str2 = constructor1.newInstance(new StringBuffer("abc"));

 泛型的基本原理:

 下面利用实例代码利用反射式怎样跳跃编译器的检查

ArrayList<Integer> collection3 = new ArrayList<Integer>();
collection3.getClass().getMethod("add",Object.class).invoke(collection3,"ssss");
		System.out.println("  collection3 :"+collection3.get(0));

 
泛型的内部原理与应用

 编译器一行一行代码进行语法检查,所以都不会报错,充分理解编译阶段和运行阶段的概念

二、讲解泛型通配符?

如果要打印一个集合所有的元素,要打印的集合不管什么么类型的集合

当第一个这样的集合:

ArrayList<Integer> collection3 = new ArrayList<Integer>();
	collection3.add(3);
printCollections(collection3);

public void printCollections(Collection<Object> collection){

for(Object obj : collection){
            System.out.println(obj);
        }

}

这样实验后是不可以通过编译器的语法校验的,因为collection3语法上是放Integer元素,但是传过去的编译器就会说怎么会存放Object类型呢?也就是说collection3集合引用了参数化Integer怎么可能又同时引用参数Object类型呢?

因此解决的方案就是在Collection<?>通配符就可以解决以上的问题

使用?通配符就可以引用其他类型化参数的类型,?通配符在定义变量主要用作做引用,可以调用与参数化无关的方法,不能调用不参数化有关的方法.
泛型的内部原理与应用
一个简单代码的引用的说明

 

                Class<?> y=Class.forName("java.lang.String");
		Class<String> x=null;
		/***
		 * 也就是说不知道什么类型可以引用确定的参数化类型,
		 * 但是参数化的类型不能引用不知道的类型
		 */
		y= x;
 

 这个是复习对于HashMap是怎么操作的.............

HashMap<String,Integer> maps=new HashMap<String,Integer>();
		maps.put("hewen",23);
		maps.put("heli",21);
		maps.put("hewu",18);
		//这个是三种遍历方式
		for(String key:maps.keySet()){//得到maps中所有的key值,也就是一个集合
			System.out.println("key: "+key);
		}
		for(Integer value:maps.values()){//得到maps中所有values值,这里也是一个集合
			System.out.println(value);
		}
		for(Map.Entry<String,Integer> entry:maps.entrySet()){
			System.out.println("姓名: "+entry.getKey()+"  年龄:"+entry.getValue());
		}
 

 Map的内部结构如图所示:
泛型的内部原理与应用
 Entry是Map的内部类

你可能感兴趣的:(泛型)