一、泛型概念简述
泛型吗,就是泛泛的类型,指代某一种类型的符号。
这样有啥好处呢?1.消除强制类型转换;2.附加类型检查,避免错误类型;3.确保Java类型安全(这才是主要目的)等。相信用过集合框架的都有类似体会。
二、泛型基础特征
1)在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数。例如java.util.Map接口的定义:
public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}
命名方式约定以大写的单个字母名称作为类型参数。
2)泛型不是协变的,即无法向上转型。不同于Object obj = new String(“str”),以下方式是错误的:
错误代码 即无法向上转型
List<int> intsList = new ArrayList<int>();
List<Object> objList = intsList;
如果第二行写成List objList = strList,可以通过编译但会出现警告(类型不安全)。那如何表示泛型为一个通用泛型,就是定义个尖括号内可以放任意类型的泛型呢?这是就要使用类型通配符了。
3)类型通配符,’?’表示。可以声明一个List<?>,作为任何泛型List的父类型。即List<?> objList = strList,这样就没啥问题了。
4)受限泛型,即给泛型定义上下限。简单说,就是类型参数必须是某类及其子类(上限),或者是某类及其父类(下限)。
怎么弄捏,例如List为传入参数,限定类型参数必须为Number,如下:
public void fun(List<? extends Number> list) {…}
上述List只接收Number及Number的子类。另一种方式,只接收Integer及其父类,则如下:
public void fun(List<? super Integer> list) {…}
1.增强for循环
LinkedList类:
LinkedList<String> linkedList = new LinkedList();
linkedList.add("汉语");
linkedList.add("英语");
for(Iterator<String> iterator = linkedList.iterator();iterator.hasNext();){
System.out.println(iterator.next());
}
ArrayList类:
ArrayList<String> strings = new ArrayList<>();
strings.add("汉语");
strings.add("英语");
for(Iterator<String> iterator = strings.iterator();iterator.hasNext();){
String s = iterator.next();
System.out.println(s);
}
Vector类:
特有的迭代器方法:.elements();
Vector<String> strings = new Vector<>();
strings.add("汉语");
strings.add("英语");
for(Enumeration<String> elements = strings.elements();elements.hasMoreElements();) {
String s = elements.nextElement();
System.out.println(s);
}