日期:2014-05-20  浏览次数:20776 次

静态环境下不允许类的参数是泛型类型,实在不理解!
我是个学习Java的小菜鸟,最近学习Java书中关于泛型有这么一段怎么都不理解,望大侠们指点下,谢谢!

“在泛型类的静态变量和方法是被它的所有实例所共享的,因此在静态方法、数据域或初始化语句中,为了类而引用泛型类型参数是非法的”
为什么?为什么静态环境下不允许类的参数是泛型类型?能不能解释的详细通俗点易于理解O(∩_∩)O~


------解决方案--------------------
静态的属性和方法,可以直接通过,类名.属性,类名,方法名()来调用。
泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
------解决方案--------------------
因为泛型是要在对象创建的时候才知道是什么类型的,而对象创建的代码执行先后顺序是static的部分,然后才是构造函数等等。所以在对象初始化之前static的部分已经执行了,如果你在静态部分引用的泛型,那么毫无疑问虚拟机根本不知道是什么东西,因为这个时候类还没有初始化。因此在静态方法、数据域或初始化语句中,为了类而引用泛型类型参数是非法的
------解决方案--------------------
3楼正解...
------解决方案--------------------
Java code
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>() {};
    }
}

------解决方案--------------------
好吧,懂了!

因为你获取动态的泛型类型的时候,需要你通过获取当前的类信息,而当前的类型信息的获取方法是初始化完类才能得到的吧。

Java code
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]