首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

静态环境上不允许类的参数是泛型类型,实在不理解

2012-09-18 
静态环境下不允许类的参数是泛型类型,实在不理解!我是个学习Java的小菜鸟,最近学习Java书中关于泛型有这么

静态环境下不允许类的参数是泛型类型,实在不理解!
我是个学习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] 

热点排行