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

xyhw6mcr  于 2021-06-30  发布在  Java
关注(0)|答案(6)|浏览(444)

这个问题在这里已经有答案了

泛型类的静态成员对于java中的不同类型是否不同(2个答案)
7年前关门了。
我想问一下泛型类。从泛型类创建两个对象示例时会发生什么。它们是否共享每个静态成员,或者两者都有自己的静态成员?
例如:

public A<?>(){
    public static Integer member = 0;
}

A<Integer> integer = new A<Integer>();
A<String> string = new A<String>();

两者都做 Integer 以及 String 后面有相同的参考 member ?

p1tboqfb

p1tboqfb1#

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 变量。

efzxgjgh

efzxgjgh2#

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

vuv7lop3

vuv7lop33#

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

2w3rbyxf

2w3rbyxf4#

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

zte4gxcn

zte4gxcn5#

好问题,但答案是:不,你不能因为一个非常简单的原因:编译后没有或这样的东西,只是因为向后兼容的原因java使用泛型类型擦除。
在其他语言中,如c#,事情会如您所期望的那样工作,因为c#是从泛型开始创建的。

qyzbxkaa

qyzbxkaa6#

没有类文本( A<Integer>.class 或者 Class 示例)表示任何参数化类型(如 A<Integer> ). 对于原始版本总是只有一个 A (即。 A.class ),这就是所有静态成员所属的对象。
所以你才不做这种事 A<Integer>.member ,它应该始终是原始版本 A.member (这是所有示例共享的一个(也是唯一的一个)。
你可以在这里读一篇关于这个主题的文章-泛型类型的每个示例化是否有一个静态字段的示例?。

相关问题