泛型:所谓泛型,就是变量的类型参数化。

作用:限制泛型可用类型。


  1. 简单的泛型定义使用:

public class GenericFoo<T> {

    private T foo;
    
    public void setFoo(T foo){
        this.foo = foo;
    }
    public T getFoo(){
        return this.foo;
    }
    
    public static void main(String[] args){
        //GenericFoo is a raw type, References to generic type GenericFoo<T> should be parameterized.
        GenericFoo foo = new GenericFoo(); 
        
        GenericFoo<String> sFoo = new GenericFoo<String>();
        GenericFoo<Integer> iFoo = new GenericFoo<Integer>();
        
        sFoo.setFoo("string foo");
//        sFoo.setFoo(11); //这里只能放置String类型的,放置11在编译时就会报错。
        iFoo.setFoo(11);
    }
}

2.定义两个泛型,以及泛型数组的定义使用:

public class GenericFoo2<T,E> {

    private T foo1;
    private E foo2;
    private T[] arrays;
    
    public T getFoo1() {
        return foo1;
    }
    public void setFoo1(T foo1) {
        this.foo1 = foo1;
    }
    public E getFoo2() {
        return foo2;
    }
    public void setFoo2(E foo2) {
        this.foo2 = foo2;
    }
    public T[] getArrays() {
        return arrays;
    }
    public void setArrays(T[] arrays) {
        this.arrays = arrays;
    }
    public static void main(String[] args){
        GenericFoo2<String,Boolean> gf = new GenericFoo2<String,Boolean>();
        gf.setFoo1("string");
        gf.setFoo2(false);
        gf.setArrays(new String[]{"aa","bb"});
    }
}

3.模仿ArrayList实现集合泛型化:

public class GenericCollection<E> {

    private Object[] array;
    private int index;
    
    public GenericCollection(){
        this(10);
    }
    public GenericCollection(int capacity){
        array = new Object[capacity];
    }
    
    public void add(E e){
        array[index++] = e;
    }
    public E get(int index){
        return (E)array[index];
    }
    
    public static void main(String[] args){
        GenericCollection<Integer> gc = new GenericCollection<Integer>();
        for(int i=0;i<10;i++){
            gc.add(i*2);
        }
        for(int i=0;i<10;i++){
            System.out.println(gc.get(i));
        }
    }
}