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

书里面这么写的:

public class Singleton<T>

{

private static T singleInstance    //ERROR

private static T getSingleInstance()    //ERROR

{

if(singleInstance == null)

return singleInstance;

}

}

类型擦除后,只剩下Singleton类,它只包含一个singleInstance域。因此,禁止使用带有类型变量的静态域和方法。

不太理解什么意思,为什么跟类型擦除有关系?请高手指点一下

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

AType a = Singleton.getSingleInstance();

问题来了,上面的

getSingleInstance

如何知道应该返回什么类型呢?所以这种用法是不允许的。

反过来,如果

singleInstance

getSingleInstance

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

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

AType a = s.getSingleInstance();

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

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

public class Singleton

{

private static Object singleInstance

private static Object getSingleInstance()

{

if(singleInstance == null)

return singleInstance;

}

}

调用时的语句

AType a = Singleton.getSingleInstance();

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值