这个问题在这里已经有答案了:
泛型类的静态成员对于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
?
6条答案
按热度按时间p1tboqfb1#
输出
所以,是的,这两个例子是相同的
member
变量。efzxgjgh2#
你只需要认为泛型是为了编译的目的。在运行时,两者之间没有区别
A<Integer>
以及A<String>
:它们都是A
. 因此,静态成员对于您可以创建的任何示例都是通用的,而不考虑您使用的类型。vuv7lop33#
它们都共享它们的静态属性,因为在运行时
A<Integer>
以及A<String>
不是不同的类。2w3rbyxf4#
是的,他们会共享变量。关于静态类变量的规则不会因为泛型的使用而改变。静态类变量由所有示例共享。
zte4gxcn5#
好问题,但答案是:不,你不能因为一个非常简单的原因:编译后没有或这样的东西,只是因为向后兼容的原因java使用泛型类型擦除。
在其他语言中,如c#,事情会如您所期望的那样工作,因为c#是从泛型开始创建的。
qyzbxkaa6#
没有类文本(
A<Integer>.class
或者Class
示例)表示任何参数化类型(如A<Integer>
). 对于原始版本总是只有一个A
(即。A.class
),这就是所有静态成员所属的对象。所以你才不做这种事
A<Integer>.member
,它应该始终是原始版本A.member
(这是所有示例共享的一个(也是唯一的一个)。你可以在这里读一篇关于这个主题的文章-泛型类型的每个示例化是否有一个静态字段的示例?。