为了账号安全,请及时绑定邮箱和手机立即绑定

java核心技术 卷1里面泛型一章中“泛型类的静态上下文中类型变量无效”这一节不能理解

java核心技术 卷1里面泛型一章中“泛型类的静态上下文中类型变量无效”这一节不能理解

江户川乱折腾 2019-03-14 18:19:03
书里面这么写的:public class Singleton<T>{    private static T singleInstance    //ERROR    private static T getSingleInstance()    //ERROR    {        if(singleInstance == null)            return singleInstance;    }}类型擦除后,只剩下Singleton类,它只包含一个singleInstance域。因此,禁止使用带有类型变量的静态域和方法。不太理解什么意思,为什么跟类型擦除有关系?请高手指点一下
查看完整描述

4 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

先想想你要怎么使用这个方法,我想应该是这样:


AType a = Singleton.getSingleInstance();


问题来了,上面的getSingleInstance如何知道应该返回什么类型呢?所以这种用法是不允许的。


反过来,如果singleInstance和getSingleInstance不是静态的,而是实例变量和方法的话就没问题,因为这时候需要返回何种类型是明确的:

Singleton<AType> s = new Singleton<AType>();

AType a = s.getSingleInstance();


查看完整回答
反对 回复 2019-04-17
?
LEATH

TA贡献1936条经验 获得超6个赞

泛型只有类对象才能使用, 通过<>来声明和初始化, 不同的对象泛型参数不同, 而类成员变量属于所有对象, 因此不予许声明泛型类成员变量(我自己的一点想法, 刚刚看完tij的这一部分)


查看完整回答
反对 回复 2019-04-17
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

类型擦除后,泛型类型会被替换成具体类,一般是Object,所以假如不考虑错误,你的类擦除后就是


public class Singleton

{

    private static Object singleInstance

    private static Object getSingleInstance()

    {

        if(singleInstance == null)

            return singleInstance;

    }

}

调用时的语句


AType a = Singleton.getSingleInstance();

相当于Object对象赋值给a,这是不允许的,需要强制转换


这里就跟 “代码宇宙” 说的一样了,getSingleInstance不知道应该返回什么类型,只有运行时才能确认,所以这种写法是有问题的。


查看完整回答
反对 回复 2019-04-17
?
森栏

TA贡献1810条经验 获得超5个赞

因为所有泛型类最终映射到同一个原始类型类,而静态属性是类级别的,类和实例共同拥有它的一份存储,因此一份存储无法安放多个类型的属性。静态方法也是如此。

具体参看Java泛型: 类型擦除(type erasure)


查看完整回答
反对 回复 2019-04-17
  • 4 回答
  • 0 关注
  • 546 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号