我想问一下泛型类。当我从泛型类创建两个对象实例时会发生什么。他们是否共享每个静态成员,或者两者都拥有自己的静态成员?
例如:
public A<?>(){
public static Integer member = 0;
}
A<Integer> integer = new A<Integer>();
A<String> string = new A<String>();
Integer
和String
两者在member
后面是否具有相同的引用?
答案 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>.class
或Class
实例)代表任何参数化类型(如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
的实例。因此,静态成员对于您可以创建的任何实例都是通用的,而不考虑您使用的类型。