静态环境下不允许类的参数是泛型类型,实在不理解!
我是个学习Java的小菜鸟,最近学习Java书中关于泛型有这么一段怎么都不理解,望大侠们指点下,谢谢!
“在泛型类的静态变量和方法是被它的所有实例所共享的,因此在静态方法、数据域或初始化语句中,为了类而引用泛型类型参数是非法的”
为什么?为什么静态环境下不允许类的参数是泛型类型?能不能解释的详细通俗点易于理解O(∩_∩)O~
[解决办法]
静态的属性和方法,可以直接通过,类名.属性,类名,方法名()来调用。
泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
[解决办法]
因为泛型是要在对象创建的时候才知道是什么类型的,而对象创建的代码执行先后顺序是static的部分,然后才是构造函数等等。所以在对象初始化之前static的部分已经执行了,如果你在静态部分引用的泛型,那么毫无疑问虚拟机根本不知道是什么东西,因为这个时候类还没有初始化。因此在静态方法、数据域或初始化语句中,为了类而引用泛型类型参数是非法的
[解决办法]
3楼正解...
[解决办法]
public class Abc { static abstract class AA<T> { static { AA.class.getGenericSuperclass(); System.out.println(1); } } public static void main(String[] args) { new Abc.AA<Integer>() {}; }}
[解决办法]
好吧,懂了!
因为你获取动态的泛型类型的时候,需要你通过获取当前的类信息,而当前的类型信息的获取方法是初始化完类才能得到的吧。
public class Abc { static abstract class AA<T> { { // 动态获取泛型类型 Class clz = (Class) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; System.out.println(clz.getName()); } } public static void main(String[] args) { new Abc.AA<Abc>() {}; }}[img=http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/2.gif][/img]