一、下面是说明泛型的基本原理与代码的应用
/** * 利用反射就可以不用把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()); }