C++:
类模板实例化的每个模板类(每个模板类指的是对于声明时候对模板指定的类型,如List<int>,List<double>中的int,double.)都有自己的类模板静态数据成员,该模板类的所有对象,共享一个静态数据成员。
Tips:
(重要)1.模板类的静态数据成员应在文件范围内初始化。(包含模型)
(重要)2.每个模板类有自己的类模板的静态数据成员和成员函数副本。
1.2详见《C++Templates》
示例代码:
#include <iostream>
using namespace std;
template < typename T >
class Test
{
public:
Test(T num){
k += num;
}
Test(){
k += 1;
}
static void incrementK()
{
k += 1;
}
static T k;
};
template<typename T>
T Test<T>::k = 0;
int main()
{
//static Field
Test<int> a;
Test<double> b(4);
cout << "Test<int>::k --> " << a.k << endl;
cout << "Test<double>::k --> " << b.k << endl;
Test<int> v;
Test<double> m;
cout << "Test<int>::k --> " << Test<int>::k << endl;
cout << "Test<double>::k --> " << Test<double>::k << endl;
//static Function
cout << endl;
Test<int>::incrementK();
cout << "After invoke Test<int>::incrementK() Test<int>::k --> " << Test<int>::k << endl;
Test<double>::incrementK();
cout << "After invoke Test<double>::incrementK() Test<double>::k --> " << Test<double>::k << endl;
return 0;
}
测试输出:
Java:
1、对于Java来说并不存在泛型类,List<String> l1和 List<String> l2会被当成一个类进行处理①测试程序如下,也没有实例化的类生成额外的.class文件。
2、不管为泛型的参数传入何种实参,他们依旧被当做同一个类,因此在静态方法,静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。
①测试程序:
import java.util.ArrayList;
import java.util.List;
public class A3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> l1List = new ArrayList<>();
List<String> l2List = new ArrayList<>();
System.out.println(l1List.getClass() == l2List.getClass());
}
}
输出:
试图在泛型类中定义静态变量,导致编译错误:
public class R<T> {
static T info;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
错误: