java 关于泛型的一些知识点

public class Generic <T>{
    private T ob;
    public Generic(T ob){
        this.ob=ob;
    }
    public T GetOb(){
        return ob;
    }
    public void setOb(T ob){
        this.ob=ob;
    }
    public void showType(){
        System.out.println("实际类型是:"+ob.getClass().getName());
    }
    public static void main(String[] args) {
        Generic<Integer>intg=new Generic<Integer>(3);
        intg.showType();
        Generic<String>strg=new Generic<String>("sd");
        strg.showType();
        //intg=strg;使用泛型可以避免这种错误的语句出现 因为会报错
    }
}

Java中泛型可以实现参数的任意化,根据实例化类时 尖括号内指定的类型   来改变被实例化的类Generic类中参数的类型。

如果想让定义的泛型类使用指定范围的类型,可以使用extends关键字来进行限制

public class Generic <T extends Integer>{
    
}

如上,Generic<String>g=new Generic<String>("sds");语句将会报错,因为不是Ineteger类型

如果一个方法的参数是一个不确定类型的参数,那么需要使用通配符<?>来表达即将填入的参数类型不确定,而不是使用<Object>

public void func(Generic <?>generic){
        //
    }

如果参数部分写为Generic <Object>generic 那么Generic参数化类型被明确Object参数化类型,那么填入Integer参数化类型的Generic对象会报错

被通配符限定的类型参数范围,如下:

public void func(Generic <? extends Number>generic){
        //
    }

泛型在使用的时候需要注意以下几点:

1. 泛型类型不能实例化,即不能new T

2. 不能实例化泛型数组,即不能T[] array=new T[2];

    不能创建一个类型特定的泛型引用的数组,即不能 Gen<String>[] array=new Gen<String>[2];

    但是可以用通配符创建泛型类型的引用数组:Gen<?>[] array=new Gen<?>[2];

3. 不能用类型参数替换将基本类型

4. 异常:不能捕获也不能抛出泛型类的异常对象

5. 不能在静态变量或者静态方法中引用类型参数,即:static T ob;是非法的