Question:
There is a Java generics class like:
public class MyClass<T> {
static long myField=System.currentTimeMillis();
//blah-blah
}
Two objects are created:
MyClass<String> var1=new MyClass<String>();
MyClass<Integer> var2=new MyClass<Integer>();
question: are var1.myField
and var2.myField
?
Update
And if it is a template in C ++ / C # – then will they be the same or not?
Answer:
Answer: Yes, they are the same for Java
Your example is not the best one to demonstrate this. It is known that StringBuilder
does not reference the same pool and creates a new object each time. Let's use it to validate the statement:
public class Clazz<T> {
static StringBuilder myField= new StringBuilder("Test text");
public static void main (String args[]) throws InterruptedException {
Clazz<String> var1=new Clazz<String>();
Clazz<Integer> var2=new Clazz<Integer>();
// Одинаковые ли ссылки на объект?
System.out.println(var1.myField == var2.myField);
// Одинаковы ли содержания объектов?
System.out.println(var1.myField.toString().equals(var2.myField.toString()));
}
}
Output:
true
true
In C ++, as far as I understand, there is no direct analogue of the generic class. There are templates and they work somehow differently. I jotted down some code:
template <class T> class Test {
public: static int count;
};
template <class T> int Test <T> ::count;
int main() {
Test <int> a;
Test <int> b;
Test <double> c;
a.count = 2;
b.count = 1;
c.count = 1;
// Одинаковы ли ссылки?
cout << (&a.count == &b.count) << endl;
// Одинаковы ли содержания?
cout << (a.count == b.count)<< endl;
// Одинаковы ли ссылки?
cout << (&a.count == &c.count) << endl;
// Одинаковы ли содержания?
cout << (a.count == c.count) << endl;
return 0;
}
A static variable inside a template turns out to be the same for objects created with the same type ( int
) and different for different types. The output of this program is as follows:
Output:
1
1
0
1
There is no way to do research in C # (OS does not support), but I found a similar question on the English-language StackOverflow: Are static members of a generic class tied to the specific instance? …
Things there don't seem to be very different from C ++.
A static variable is the same for all instances of the same type.
Foo<int>
andFoo<string>
are two different types. This can be shown in the following example:// Результатом будет "False" Console.WriteLine(typeof(Foo<int>) == typeof(Foo<string>));
This can be found in the 1.6.5 paragraph of the C # Language Specification (for C # 3):
….