还是关于java泛型的问题:在静态方法中为什么不能引用类级别的类型参数?

ecoo168 2012-09-17 10:17:56
不要回答因为泛型类型参数需要声明对象时指定,而静态不需要对象就可以引用什么的。这个根本就不是原因。泛型和运行时系统没有一点关系。
我解释一下在静态变量中不能使用类型参数的原因:因为静态变量为所有实例共享,如果可以使用,那么当使用不同的类型参数实例化对象时会导致编译器插入强制类型转换代码错误(1.5版泛型指南上有实例解释)。(换句话说泛型的实现机制擦拭法决定了不能再静态变量中使用类型参数)。但是这个问题并不影响静态方法中使用类型参数,而且静态方法可以是泛型方法,既然可以使泛型方法,那我引用类级别的类型参数又怎么了嘛,完全可以的啊。
...全文
904 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Little-By-Little 2015-02-08
  • 打赏
  • 举报
回复
楼主,最近我也为这个问题烦恼,你的前半段解惑提醒了我; 我想,应该是这样的吧: 首先,在JVM加载Class的时候会将类中所有的常量,静态常量,静态方法写到内存的方法区内; 其次,所有的常量,静态常量和静态方法在方法区内有且只有一份,并为所属类所创建的所有对象共享; 那么用你的方式解释,问题来了,如果静态常量和静态方法中使用了类的类型变量,当程序猿使用不同的类型参数实例化对象时会导致编译器插入强制类型转换代码错误(1.5版泛型指南上有实例解释); 例如,存在一个C泛型类,其静态方法中使用了类的类型变量,先后定义了A对象,B对象,那么如果A对象先把类的类型变量初始化为String,而B对象后把类的类型变量初始化为Integer。此时,静态方法中类的类型变量为Integer类型,而A对象又调用了这个静态方法。会出现你说的错误~ 类似于数据库中的读脏数据~ 以上你应该明白; 那么关键在于: 独立的泛型静态方法,在不考虑多线程的情况下,同一时间点,只会被初始化并调用一次,不会出现重叠初始化并错误调用,不会出现类似数据库中读脏数据的情况,所以不会出现强制类型转换的代码错误。
ecoo168 2012-09-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
对象在实例化的时候才能知道具体是什么类型,而静态部分是JVM加载class是初始化的,而这个时候非静态部分是没有初始化的,所以JVM根本也不知道你的泛型到底是什么东西。
[/Quote]你的第一句话和最后一句话矛盾。JVM不知道泛型是什么东西所以我使用静态方法引用泛型,也没问题 。
ecoo168 2012-09-20
  • 打赏
  • 举报
回复
是啊,正是JVM不知道泛型,所以才有这个疑问。 静态方法可以使泛型方法,泛型方法的实现机制证明静态方法可以引用类级别的类型参数,但为什么不允许。
安特矮油 2012-09-18
  • 打赏
  • 举报
回复
对象在实例化的时候才能知道具体是什么类型,而静态部分是JVM加载class是初始化的,而这个时候非静态部分是没有初始化的,所以JVM根本也不知道你的泛型到底是什么东西。
ecoo168 2012-09-17
  • 打赏
  • 举报
回复
回楼下的,我只能回答在静态变量中不能使用类型参数,不能回答在静态方法中为什么不能引用类级别的类型参数,我的回答只是抛砖引玉。以前这个问题我问过,很多人都给过我如上回答,其实都不正确。最近看了深入JVM和java1.5泛型指南中文版,又想起这个问题。只想大家帮忙从实现机制擦拭法的角度回答,而不是胡乱猜测。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧