欢迎光临散文网 会员登陆 & 注册

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

2023-03-29 13:13 作者:Yimfan伊豆桑  | 我要投稿

问题起源

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

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

问题

为什么使用静态方法时要在static后面加<T>的原因

根本原因有以下两点:

  1. 静态方法和普通方法的生命周期不同

    1. 静态方法生命周期属于类加载的时候,在Java中泛型只是一个占位符,必须传递具体类型才可以使用,也就是类实例化的时候才传递具体参数类型,由于静态方法的加载在类实例化之前,也就是说在类未实例化的时候,类中的泛型还没有传递真正的类型参数,这时候静态方法就已经加载完成。显然,静态方法不能使用/也就是访问不到泛型类中的泛型,所以需要加<T>声明使用哪种泛型类型。

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

  2. 在Java中泛型都会在编译器之后被擦除为原始类型

    1. 在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。

最后

感谢大家对我的支持,我搬运的一些优质视频我自己也会看,觉得有价值才会分享给大家,而不是一味的搬运,后续也会分享我在日常工作中遇到的技术难题以及如何解决的思路,希望大家多多支持,帮忙点赞。

关于使用泛型时静态方法为什么要加的原因的评论 (共 条)

分享到微博请遵守国家法律