4 回答

TA贡献1752条经验 获得超4个赞
先想想你要怎么使用这个方法,我想应该是这样:
AType a = Singleton.getSingleInstance();
问题来了,上面的getSingleInstance如何知道应该返回什么类型呢?所以这种用法是不允许的。
反过来,如果singleInstance和getSingleInstance不是静态的,而是实例变量和方法的话就没问题,因为这时候需要返回何种类型是明确的:
Singleton<AType> s = new Singleton<AType>();
AType a = s.getSingleInstance();

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

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不知道应该返回什么类型,只有运行时才能确认,所以这种写法是有问题的。

TA贡献1810条经验 获得超5个赞
因为所有泛型类最终映射到同一个原始类型类,而静态属性是类级别的,类和实例共同拥有它的一份存储,因此一份存储无法安放多个类型的属性。静态方法也是如此。
具体参看Java泛型: 类型擦除(type erasure)
添加回答
举报