Loading

Java 静态泛型方法为什么要在返回值之前使用泛型

静态方法定义

静态泛型方法要在返回值之前使用泛型声明此方法为泛型方法:

/**
     * 泛型方法的基本介绍
     * @param tClass 传入的泛型实参
     * @return T 返回值为T类型
     * 说明:
     *     1)public 与 返回值中间<T>非常重要,可以理解为声明此方法为泛型方法。
     *     2)只有声明了<T>的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
     *     3)<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
     *     4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
     */
    public static <T> T genericMethod(Class<T> tClass)throws InstantiationException,IllegalAccessException{
        T instance = tClass.newInstance();
        return instance;
    }

错误写法:public static BaseResponse<T> success() {}
正确写法:public static <T> BaseResponse<T> success() {}

原理

在java中泛型只是一个占位符,必须在传递类型后才能使用。就泛型类而言,类实例化时才能传递真正的类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数时,静态方法就已经加载完成。显然,静态方法不能使用/访问泛型类中的泛型。

这和静态方法不能调用普通方法/访问普通变量类似,都是因为静态申明与非静态申明的生命周期不同。

因此如果方法没有声明为泛型方法的话,那么这个方法就不能 访问泛型、把泛型当成返回值 等涉及到泛型的操作。

因此也不能定义泛型静态变量,因为静态变量在java程序一运行时就已经被载入内存,而此时它的类型无法确定,而开辟空间必须知道类型,两者矛盾。

posted @ 2023-04-23 13:37  拾月凄辰  阅读(1055)  评论(0编辑  收藏  举报