JAVA_基础泛型
泛型
-
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实 际的类型参数,也称为类型实参)。
-
从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念, 允许我们在创建集合时再指定集合元素的类型,正如:List,这表明 该List只能保存字符串类型的对象。
JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持, 从而可以在声明集合变量、创建集合对象时传入类型实参。
在集合中使用泛型:
- 集合接口或集合类在JDK 5.0时都修改为带泛型的结构。
- 在实例化集合类时,可以指明具体的泛型类型。
- 指明完以后,在集合类或接口中凡是定义类或接口时,内部机构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型的类型。
比如:add(E e)
→实例化以后:add(Integer e)
- 注意点:泛型的类型必须时类,不能是基本数据类型。需要用到基本数据类型时,可以使用包装类替换。
- 如果实例化时,没有指明泛型的类型。默认类型为
java.lang.Object类型
。
在集合中使用泛型之前的情况(以ArrayList为例)
public void test() {
ArrayList list = new ArrayList();
// 要求:存放数字
list.add(123);
list.add(456);
list.add(848);
list.add(-485);
// 问题一:类型不安全
list.add("Tom");
for (Object score : list) {
// 问题二:强转时,可能出现ClassCastException异常
int stuScore = (Integer) score;
System.out.println(stuScore);
}
}
在集合中使用泛型的情况(以ArrayList为例)
public void test2() {
ArrayList<Integer> list = new ArrayList<Integer>();
// JDK 7新特性:类型推断
// ArrayList<Integer> list = new ArrayList<>();
list.add(85);
list.add(75);
list.add(15);
list.add(-87);
// 编译时,就会进行检查,保证数据的安全
//list.add("Tom");
// 方式一
for (Integer score : list) {
// 避免了强转操作
int stuScore = score;
System.out.println(stuScore);
}
// 方式二
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
在集合中使用泛型的情况(以HashMap为例)
public void test3() {
HashMap<String, Integer> map = new HashMap<String, Integer>();
// JDK 7新特性:类型推断
HashMap<String, Integer> map = new HashMap<>();
map.put("Tom",87);
map.put("Jerry",65);
map.put("Mack",87);
// map.put(125,"ABC");
// 泛型的嵌套
Set<Map.Entry<String,Integer>> entry = map.entrySet();
Iterator<Map.Entry<String,Integer>> iterator = entry.iterator();
while (iterator.hasNext()) {
Map.Entry<String,Integer> e = iterator.next();
String key = e.getKey();
Integer value = e.getValue();
System.out.println(key + "-----" + value);
}
}