为什么类型参数不能作为静态变量的类型
2013-02-18 11:43
239 查看
静态变量是被泛型类所有实例所共享的。对于声明为MyClass<T>的类,访问其中的静态变量的方法仍然是MyClass.myStaticVar。不管是通过new MyClass<String>还是new MyClass<Integer>创建的对象,都是共享一个静态变量。假设允许类型参数作为静态变量的类型。那么考虑下面一种情况:
MyClass<String> class1 = new MyClass<String>();
MyClass<Integer> class2 = new MyClass<Integer>();
class1.myStaticVar = "hello";
class2.myStaticVar = 5;
由于泛型系统的类型擦除(type erasure)。myStaticVar被还原成Object类型,然后当调用class1.myStaticVar= "hello"; 编译器进行强制类型转换,即myStaticVar =
(String)"hello";接着调用class2.myStaticVar语句时,编译器继续进行强制类型转换,myStaticVar = (Integer)Integer.valueOf(5); 此时myStaticVar是String类型的,当然该语句会在运行时抛出ClassCastException异常,这样一来存在类型安全问题。因此泛型系统不允许类的静态变量用类型参数作为变量类型。
当然,静态泛型方法也不允许。
MyClass<String> class1 = new MyClass<String>();
MyClass<Integer> class2 = new MyClass<Integer>();
class1.myStaticVar = "hello";
class2.myStaticVar = 5;
由于泛型系统的类型擦除(type erasure)。myStaticVar被还原成Object类型,然后当调用class1.myStaticVar= "hello"; 编译器进行强制类型转换,即myStaticVar =
(String)"hello";接着调用class2.myStaticVar语句时,编译器继续进行强制类型转换,myStaticVar = (Integer)Integer.valueOf(5); 此时myStaticVar是String类型的,当然该语句会在运行时抛出ClassCastException异常,这样一来存在类型安全问题。因此泛型系统不允许类的静态变量用类型参数作为变量类型。
当然,静态泛型方法也不允许。
相关文章推荐
- Windows程序的模块之间为什么不能使用STL容器作为参数
- 契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约
- 为什么不能使用成员变量的值作为成员函数的默认参数?
- 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器
- java类中用类的数组作为函数参数传给类,为什么不能直接对类的数组进行操作?
- Python陷阱:为什么不能用可变对象作为函数的默认参数值
- 为什么匿名内部类参数必须为final类型
- 为什么++i可以作为左值,i++不能作为左值,针对int
- C语言技巧【枚举作为函数变量类型】【数据输入与输出】【do while循环体内scanf函数被跳过,循环结束】【用const修饰函数的参数】
- 为什么auto_ptr智能指针不能作为STL标准容器的元素
- 为什么两个float类型的数值不能直接相等
- oracle 查询日期类型为什么不能用=
- jsonp进行跨域访问,回调函数作为参数返回值的二种类型
- C#引用类型作为方法的参数分析
- 【转自JavaEye】为什么“局部内部类能且只能访问所在方法中的final类型的参数和变量”?
- .NET DateTime类型变量作为参数时设置默认值
- C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?
- 为什么“-1”能作为判断文本文件结束的标志然而为什么不能作为二进制文件是否结束的标志?
- 为什么匿名内部类参数必须为final类型
- 关于 fstream 类型作为参数传递的问题