泛型类共享静态成员吗​​?

时间:2013-06-05 21:04:52

标签: java generics static

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

例如:

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

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

IntegerString两者在member后面是否具有相同的引用?

6 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

很好的问题,但是anwser是:不,你不能因为一个非常简单的原因:一旦编译,就没有A&lt; Integer&gt;这样的东西。或者A&lt; String&gt;,只有A因为向后兼容的原因,Java使用泛型类型删除

C#等其他语言中,事情会按预期运行,因为C#是从一开始就用泛型创建的。

答案 2 :(得分:2)

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

这就是为什么你不会做A<Integer>.member这样的事情,它应该始终是原始版本A.member(这是所有实例共享的那个(和唯一的))。

您可以在此处阅读有关此主题的文章 - Is there one instances of a static field per instantiation of a generic type?

答案 3 :(得分:0)

是的,他们会分享变量。关于静态类变量的规则不会根据泛型的使用而改变。所有实例都共享一个静态类变量。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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