我是个学习Java的小菜鸟,最近学习Java书中关于泛型有这么一段怎么都不理解,望大侠们指点下,谢谢!“在泛型类的静态变量和方法是被它的所有实例所共享的,因此在静态方法、数据域或初始化语句中,为了类而引用泛型类型参数是非法的”
为什么?为什么静态环境下不允许类的参数是泛型类型?能不能解释的详细通俗点易于理解O(∩_∩)O~

解决方案 »

  1.   

    还是不太明白,为什么泛型的类型参数只能是类类型?你说的这个类类型是引用类型的意思吗?我看书上写泛型必须是引用类型不能用像int、double、char这样的基本类型来替换泛型类型。
    对于这样的概念我也不是太理解为什么,只能先记下来这个规则。望高手指教下我这个菜鸟!不甚感激!
      

  2.   

    因为泛型是要在对象创建的时候才知道是什么类型的,而对象创建的代码执行先后顺序是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>() {};
    }
    }上面的代码没有问题啊~不明白LZ的意思呢。
      

  4.   

    好吧,懂了!因为你获取动态的泛型类型的时候,需要你通过获取当前的类信息,而当前的类型信息的获取方法是初始化完类才能得到的吧。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>() {};
    }
    }
      

  5.   

    我想说3楼的话虽然好像解释了原因,但这不是真正的原因。看一看泛型的实现机制擦拭法就知道了,泛型其实和运行时JVM没有关系,StatiC的类型成员可以使用独立的泛型方法,所以理论上JAVA的静态方法引用类级别的类型参数没有问题。从很多资料上来看静态方法不能引用类型参数应该是个硬性规定,没有原因,所有资料上都没解释为什么。不能声明类型参数的静态变量这个原因倒是像大多数资料解释的那样,是因为静态变量共享,在插入强转会导致类型转换错误。其实我也很想知道为何要禁止静态方法引用类型参数,我可以百分百肯定3楼的解释不正确。
      

  6.   

    补充9楼,T实际上被擦拭为Object我完全可以这样用Pair<String>.静态方法名(s);