泛型类是否共享静态成员?



我想问一下泛型类。当我从泛型类创建两个对象实例时会发生什么?它们是共享每个静态成员,还是都有自己的静态成员?

例如:

public A<?>(){
    public static Integer member = 0;
}
A<Integer> integer = new A<Integer>();
A<String> string = new A<String>();

IntegerStringmember后面有相同的引用吗?

public class A<T>{
    public static Integer member = 0;
    public static void main(String[] args)
    {
      A<Integer> integer = new A<Integer>();
      A<String> string = new A<String>();
      integer.member++;
      System.out.println(string.member);
    }
}

输出
1

所以,是的,这两个实例共享相同的member变量。

好问题,但答案是:不,你不能因为一个非常简单的原因:一旦编译,没有这样的东西:a 或a ,只有a,因为向后兼容性原因Java使用泛型类型擦除

在其他语言中,比如 c# ,事情会像你期望的那样工作,因为c#从一开始就是用泛型创建的。

没有表示任何参数化类型(如A<Integer>)的类文字(A<Integer>.classClass实例)。对于原始版本A(即A.class),总是只有一个,并且所有静态成员都属于它。

这就是为什么您不会做类似A<Integer>.member的事情,它应该始终是原始版本A.member(并且这是所有实例共享的一个(也是唯一的))。

您可以在这里阅读关于这个主题的一篇文章—是否每个泛型类型的实例化都有一个静态字段的实例?

是的,它们会共享这个变量。关于静态类变量的规则不会因为泛型的使用而改变。静态类变量由所有实例共享。

它们都共享它们的静态属性,因为在运行时A<Integer>A<String>不是不同的类。

您只需要认为泛型是用于编译目的的。在运行时,A<Integer>A<String>之间没有区别:它们都是A的实例。因此,静态成员对于您可以创建的任何实例都是通用的,而不必考虑您使用的类型。

最新更新