回楼下的,我只能回答在静态变量中不能使用类型参数,不能回答在静态方法中为什么不能引用类级别的类型参数,我的回答只是抛砖引玉。以前这个问题我问过,很多人都给过我如上回答,其实都不正确。最近看了深入JVM和java1.5泛型指南中文版,又想起这个问题。只想大家帮忙从实现机制擦拭法的角度回答,而不是胡乱猜测。

解决方案 »

  1.   

    对象在实例化的时候才能知道具体是什么类型,而静态部分是JVM加载class是初始化的,而这个时候非静态部分是没有初始化的,所以JVM根本也不知道你的泛型到底是什么东西。
      

  2.   

    是啊,正是JVM不知道泛型,所以才有这个疑问。 静态方法可以使泛型方法,泛型方法的实现机制证明静态方法可以引用类级别的类型参数,但为什么不允许。
      

  3.   

    你的第一句话和最后一句话矛盾。JVM不知道泛型是什么东西所以我使用静态方法引用泛型,也没问题 。
      

  4.   

    楼主,最近我也为这个问题烦恼,你的前半段解惑提醒了我;
    我想,应该是这样的吧:
    首先,在JVM加载Class的时候会将类中所有的常量,静态常量,静态方法写到内存的方法区内;
    其次,所有的常量,静态常量和静态方法在方法区内有且只有一份,并为所属类所创建的所有对象共享;
    那么用你的方式解释,问题来了,如果静态常量和静态方法中使用了类的类型变量,当程序猿使用不同的类型参数实例化对象时会导致编译器插入强制类型转换代码错误(1.5版泛型指南上有实例解释);
    例如,存在一个C泛型类,其静态方法中使用了类的类型变量,先后定义了A对象,B对象,那么如果A对象先把类的类型变量初始化为String,而B对象后把类的类型变量初始化为Integer。此时,静态方法中类的类型变量为Integer类型,而A对象又调用了这个静态方法。会出现你说的错误~ 类似于数据库中的读脏数据~
    以上你应该明白;
    那么关键在于:
            独立的泛型静态方法,在不考虑多线程的情况下,同一时间点,只会被初始化并调用一次,不会出现重叠初始化并错误调用,不会出现类似数据库中读脏数据的情况,所以不会出现强制类型转换的代码错误。