java genericity - yaokun123/php-wiki GitHub Wiki
java的泛型是JDK1.5以后出现的安全机制
public static void main(){
ArrayList al = new ArrayList();
//ArrayList<String> al2 = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add(4);
Iterator it = al.iterator();
//Iterator<String> it = al.iterator();
while(it.hasNext()){
String str = (String)it.next();//强转数值类型的会有问题
//String str = it.next();
System.out.println(str);
}
}
1、将运行时的问题ClassCastException转到了编译时期
2、避免了强制转换的麻烦
泛型技术是给编译器使用的技术,用于编译时期。确保类型的安全
运行是,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除(为了兼容运行的类加载器)
当操作的引用数据类型不确定的时候,就用<>。将要操作的引用数据类型传入即可 其实<>就是一个用于接受具体引用数据类型的参数范围。
在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型
将泛型定义在接口上
interface Inter<T>{
public void show(T t);
}
class Intermpl implements Inter<String>{
public void show(String str){
}
}
class Intermpl1<Q> implements Inter<Q>{
public void show(Q q){
}
}
一般在存储元素的时候都是用上限,因为这样取出都是按照上限类型来运算的。不会出现类型安全隐患。 泛型的通配符:?(未知类型)。
public static void main(String[] args){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
ArrayList<Integer> al2 = new ArrayList<Integer>();
al.add(1);
al.add(2);
printCollection(al);
printCollection(al2);
}
public static void printCollection(Collection<String> al){
Iterator<String> it = al.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
}
修改如下:
public static void printCollection(Collection<?> al){
Iterator<?> it = al.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
还可以对类型进行限定:? extends E(接受E类型或者E的子类型对象)->上限:
public static void printCollection(Collection<? extends Person> al){
Iterator<? extends Person> it = al.iterator();
}
通常对集合中的元素进行取出操作时,可以是用下限。
public static void printCollection(Collection<?> al){}
等价于:
public static void printCollection(Collection<? extends Object> al){}
还可以对类型进行限定:? super E(接受E类型或者E的父类型对象)->下限: