书里面这么写的:
public class Singleton<T>
{
private static T singleInstance //ERROR
private static T getSingleInstance() //ERROR
{
if(singleInstance == null)
return singleInstance;
}
}
类型擦除后,只剩下Singleton类,它只包含一个singleInstance域。因此,禁止使用带有类型变量的静态域和方法。
不太理解什么意思,为什么跟类型擦除有关系?请高手指点一下
阿神2017-04-17 17:11:31
먼저 이 방법을 어떻게 사용하고 싶은지 생각해 보세요.
AType a = Singleton.getSingleInstance();
질문은 위의 getSingleInstance
가 어떤 유형을 반환해야 하는지 어떻게 알 수 있느냐는 것입니다. 따라서 이러한 사용은 허용되지 않습니다.
반대로, singleInstance
과 getSingleInstance
가 정적이 아니고 인스턴스 변수와 메서드라면 문제가 없습니다. 이때 반환해야 할 유형이 무엇인지 명확하기 때문입니다.
大家讲道理2017-04-17 17:11:31
제네릭은 클래스 객체에서만 사용할 수 있습니다. <>를 통해 선언되고 초기화됩니다. 객체마다 제네릭 매개변수가 다르며, 클래스 멤버 변수는 모든 객체에 속합니다. 선언했습니다(나 자신의 생각, tij의 이 부분을 방금 읽었습니다)
高洛峰2017-04-17 17:11:31
유형 삭제 후 일반 유형은 특정 클래스, 일반적으로 Object로 대체되므로 오류를 고려하지 않으면 삭제 후 클래스가
됩니다. 으아아아전화시 주의사항
으아아아Object 객체를 a에 할당하는 것과 동일하며 이는 허용되지 않으며 강제 변환이 필요합니다
'Code Universe'가 말한 것과 같습니다. getSingleInstance는 어떤 유형을 반환해야 할지 모르기 때문에 런타임에만 확인할 수 있으므로 이러한 방식은 문제가 있습니다.
高洛峰2017-04-17 17:11:31
모든 일반 클래스는 궁극적으로 동일한 기본 유형 클래스에 매핑되고 정적 속성은 클래스 수준에 있으므로 클래스와 인스턴스는 저장소를 공유하므로 하나의 저장소가 여러 유형의 속성을 수용할 수 없습니다. 정적 메서드에도 마찬가지입니다.
자세한 내용은 Java Generics: Type Erasure를 참조하세요