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