书中是这样说的:
public class Singleton<T>{ private static T singleInstance; //ERROR public static T getSingleInstance(){ //ERROR if(singleInstance == null) return singleInstance; } }
类型擦除后,只剩下Singleton类,它只包含一个singleInstance域。因此,禁止使用带有类型变量的静态域和方法。
刚开始对于这一段不太理解,查阅资料后仔细想想便明白了。
首先 ,类型擦除后,此泛型类会被替换成Object具体类,即类擦除后的代码为:
public class Singleton{
private static Object singleInstance;
public static Obejct getSingleInstance(){
if(singleInstance == null)
return singleInstance;
}
}
当调用此静态方法时,无需创建出这个类的一个实例,语句应该为AType a = Singleton.getSingleInstance());
,相当于将Object对象赋值给a,很明显,子类变量不允许引用父类对象,必须要有强制类型转换,而在普通的类型擦除后也正是如此,编译器会把返回Object类型的方法调用翻译为两条虚拟机指令:
- 对原始方法的调用
- 将返回的Object类型强制转换
但在这里getSingleInstance()不知道应该返回什么类型,所以这种用法是不允许的。
反过来如果singleInstance和getSingleInstance不是静态的话,代码将如下所示:
Singleton<AType> s = new Singleton<AType>();
AType a = s.getSingleInstance();
此时调用此静态方法时就必须要创建出这个类的一个实例,而需要返回何种类型也就明确了。