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 } }
错误: