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的原型来发挥作用啊!
再强调一遍。抛开这个例子,咱们单独来看——为什么不能定义静态的泛型变量?
如果允许,T就可能总是变化,Pair<String>、Pair<Integer>... ...,例如咱们想用Pair<String>去组成一个字符串,结果T却变成了Integer!
好了,不知道大家懂这个意思没,其实我现在也是没有完全懂。如有更好的解释,欢迎大家在下面的评论里补充。
接着,下面的文字解释说:如果这个程序能够运行(也就是允许题目中所提的情况),就可以声明一个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!
好了,不知道大家懂这个意思没,其实我现在也是没有完全懂。如有更好的解释,欢迎大家在下面的评论里补充。
相关文章推荐
- Day 20: 斯坦福CoreNLP —— 用Java给Twitter进行情感分析
- Java 中this,和super浅谈
- eclipse debug不了 Cannot connect to VM
- 初探设计:Java接口和抽象类何时用?怎么用?
- myeclipse10安装activiti报错 org.eclipse.graphiti.ui.editor.DiagramEditorInput
- 初探设计:Java接口和抽象类何时用?怎么用?
- Heritrix1.14.4在Eclipse的配置和使用
- java操作word
- mac上eclipse的快捷键
- SpringMVC知识二
- spring security 介绍(一)
- 深入解析Java的Spring框架中bean的依赖注入
- Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
- Java 并发编程中的 CyclicBarrier 用于一组线程互相等待
- Java 并发编程中的 CountDownLatch 锁用于多个线程同时开始运行或主线程等待子线程结束
- Java 并发编程中的 Executor 框架与线程池
- NetBeans 8.1安装Struts2插件
- java操作excel总结---poi
- Java-----Java进制转换
- javaweb学习总结(六)——Servlet开发(二)