泛型<Generic>之类型安全<Type-Safe>
1->List(collection,数组...类似)
在构造对像的时候就可以知道该对象操作的是什么样的数据<对象>类型,类型安全且省去烦人的转换类型。
通过Object<E> = new Object<E>();来实现,E占位符
引用
//Tiger之前
List list = new ArrayList();
list.add("String");
list.add(new Integer(111));
list.add(111);//提示错误,不能存放primitiv值,Tiger可以,
//操作的类型没有确定(String和Integer类型可以同时放在List对象),类型不安全
//取值
String str = list.get(0); //提示错误,必须有类型转换,如下写法
String str = (String)list.get(0);
//Tiger
List<String> tiger = new ArrayList<String>();//说明只能用操作String类型
tiger.add("String");
tiger.add(new Integer(111));//改语句编译器提示错误
//操作的类型确定(String和Integer类型可以同时放在List对象),类型安全
//取值
String str = tiger.get(0);//无需类型转换
but,generic不支持primitive类型,如以下代码不支持
引用
List<int> list = new ArrayList<int>
2->Map
跟List一样,只是需要两个类型参数,如:
引用
Map<String,String> strings = new Map<String,String>
Map<Long,Object> maps = new Map<Long,Object>
3->Iterator
当你对一个集合(collection)参数化了,那么你也应该参数化Iterator(当然,是用到collection的Iterator时候),否则不是编译失败就是运行失败...且看看
引用
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
for(Iterator i = list.iterator();i.hasNext();){
//下面这一句编译不通过,提示类型转换错误,list参数化了,但是Iterator也需要参数化,写成 Iterator<String> i = list.iterator();
String str = i.next();
System.out.println(str);
}
//如果这样,collection不参数化,Iterator参数化,运行抛出异常
引用
List list = new ArrayList();
list.add("Hello");
list.add("World");
list.add(1);
for(Iterator<String> i = list.iterator();i.hasNext();){
//输出 1 时,抛出:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer异常
String str = i.next();
System.out.println(str);
}
//List list = new ArrayList(); 写成 List<String> list = new ArrayList<String>();