java genericity - yaokun123/php-wiki GitHub Wiki

java 泛型

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的父类型对象)->下限:
⚠️ **GitHub.com Fallback** ⚠️