关于使用泛型时静态方法为什么要加的原因

问题起源
最近我转发了一John的泛型讲解视频,

看到了评论区有一位粉丝关于静态方法泛型使用的疑问,我当时在评论区也解答回复了,但是如果以后有人也有疑问的话,避免重复回答,所以记录下来,方便大家查看。

为什么使用静态方法时要在static后面加<T>的原因
根本原因有以下两点:
静态方法和普通方法的生命周期不同
静态方法生命周期属于类加载的时候,在Java中泛型只是一个占位符,必须传递具体类型才可以使用,也就是类实例化的时候才传递具体参数类型,由于静态方法的加载在类实例化之前,也就是说在类未实例化的时候,类中的泛型还没有传递真正的类型参数,这时候静态方法就已经加载完成。显然,静态方法不能使用/也就是访问不到泛型类中的泛型,所以需要加<T>声明使用哪种泛型类型。
这和静态方法不能调用普通方法/访问普通变量类似,都是因为静态声明与非静态声明方法的生命周期不同。
在Java中泛型都会在编译器之后被擦除为原始类型
在Java中泛型属于伪泛型,也就是只在编译期生效,编译之后会进行泛型擦除,擦除为最原始的类型,如果是T,最后为Object,如果是<? extends edou>,则擦除为edou类型。
例子
public class Demo<T>{
public static T stataicMethod(){...}
//上面这个是编译会报错的;
public static<T> T stataicMethod(){...}
// 这个编译器可以通过;
}
在上面我们解释了,Java的泛型在编译之后会被擦除,这个是共识。
在上面的例子,代码编译后T都被会擦除为原始类型,也就是Object,那为什么static 方法不加<T>会报错,是因为泛型类Demo中的泛型参数的实例化是在定义对象的时候指定的,而静态变量和静态方法不需要使用对象来调用。对象都没有创建,去调用没有加<T>的静态方法,这时候编译器无法确定这个泛型参数是何种类型,这时候就会编译报错,所以加<T>表明这是一个泛型方法,在泛型方法中使用的T是自己在方法中定义的 T,而不是泛型类中的T。
最后
感谢大家对我的支持,我搬运的一些优质视频我自己也会看,觉得有价值才会分享给大家,而不是一味的搬运,后续也会分享我在日常工作中遇到的技术难题以及如何解决的思路,希望大家多多支持,帮忙点赞。