您的位置:首页 > 编程语言 > Java开发

java为什么不能在静态域或方法中引用类型变量?

2015-12-05 18:13 405 查看
在《Java核心技术 卷I》中,提到“不能再静态域或方法中引用类型变量”。示例代码如下:



接着,下面的文字解释说:如果这个程序能够运行(也就是允许题目中所提的情况),就可以声明一个Singleton<Random>共享随机数生成器,声明一个Singleton<JFileChoose>共享文件选择器对话框。但是,这个程序无法工作。类型擦除之后,只剩下Singleton类,它只包含一个singleInstance域。因此,禁止使用带有类型变量的静态域和方法。

上面的解释看得云里雾里的,后来才似有所悟,大概的意思是这样的吧:如果允许的话,由于静态的域和方法都是可以被类直接调用的,所以上面的情况就会出现T随时可能被修改的情况。打个比方,咱们设有类A 和 B,如果一个地方咱们调用Singleton<A>.getSingleInstance( ),得到的结果是A的对象a,如果后来又有一个地方,调用了Singleton<A>.getSingleInstance(
),那么等到的结果是什么呢? 还是A的对象a-----但咱们想得到的可是B的对象啊! 咱们再退一步,即使得到的是B的对象b,那么,将会导致前面的引用变量a指向b(因为这是个单例模式),这也不是咱们所希望的。

网上有人说跟静态的初始化有关,但我个人觉得似乎跟静态初始化并无关系。因为咱们在调用这个类时,无论指定还是不指定T的类型,都不影响初始化吧?如果指定了,那就是T类型,如果没指定,至少也有T的原型来发挥作用啊!

再强调一遍。抛开这个例子,咱们单独来看——为什么不能定义静态的泛型变量?

public class Pair<T> {
	
	public static T t;
	
}


如果允许,T就可能总是变化,Pair<String>、Pair<Integer>... ...,例如咱们想用Pair<String>去组成一个字符串,结果T却变成了Integer!

好了,不知道大家懂这个意思没,其实我现在也是没有完全懂。如有更好的解释,欢迎大家在下面的评论里补充。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: