泛型
泛型:和类型不相关 只关注算法的实现 一套算法可以处理任意的类型
Object 实现一个通用的顺序结构:
两点不好:
1.方法的返回值必须做类型的强转
2.类型强转时,没有类型的检查机制
泛型的优点:
1.类型检查
2.不用类型的强转
1.泛型编程的类型擦除机制是什么?
编译器编译代码的过程中,用用户指定的具体类型,检查方法中所有的泛型参数,看类型是否匹配,如果不匹配,编译报错;如果匹配,最终泛型都被擦除为Object类型
(1) 如下是一个没有使用泛型的集合及其代码实现:
package test;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class TestGeneric {
@Test
public void test1(){
List list = new ArrayList();
list.add(190);
list.add(180);
list.add(162);
//风险1:没有使用泛型,任何Object及其子类的对象都可以添加进来
list.add(new String("AA"));
for (int i=0;i<list.size();i++){
//风险2:强转为int型时,可能报ClassCastException的异常
int score =(Integer) list.get(i);
System.out.println(score);
}
}
}
运行结果如下:
(2)接下来我们在集合中使用泛型,代码实现如下:
@Test
public void test2(){
List<Integer> list = new ArrayList<Integer>();
list.add(87);
// list.add("AA");
for (int i=0;i<list.size();i++){
int score =list.get(i);
System.out.println(score);
}
}
此处还有另一种遍历方式:
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
运行结果如下:
(3)我们接下来在Map中使用泛型进行示范:
@Test
public void test3(){
Map<String,Integer> map = new HashMap<>();
map.put("AA",18);
map.put("BB",19);
map.put("CC",20);
Set<Map.Entry<String,Integer>> set = map.entrySet();
for (Map.Entry<String,Integer> o:set){
System.out.println(o.getKey()+"===="+o.getValue());
}
}