java核心技术 卷1里面泛型一章中“泛型类的静态上下文中类型变量无效”这一节不能理解
ringa_lee
ringa_lee 2017-04-17 17:09:31
0
4
954

书里面这么写的:

public class Singleton<T>
{
    private static T singleInstance    //ERROR
    private static T getSingleInstance()    //ERROR
    {
        if(singleInstance == null)
            return singleInstance;
    }
}

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

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

ringa_lee
ringa_lee

ringa_lee

모든 응답(4)
阿神

먼저 이 방법을 어떻게 사용하고 싶은지 생각해 보세요.

AType a = Singleton.getSingleInstance();

질문은 위의 getSingleInstance가 어떤 유형을 반환해야 하는지 어떻게 알 수 있느냐는 것입니다. 따라서 이러한 사용은 허용되지 않습니다.

반대로, singleInstancegetSingleInstance가 정적이 아니고 인스턴스 변수와 메서드라면 문제가 없습니다. 이때 반환해야 할 유형이 무엇인지 명확하기 때문입니다.

으아아아
大家讲道理

제네릭은 클래스 객체에서만 사용할 수 있습니다. <>를 통해 선언되고 초기화됩니다. 객체마다 제네릭 매개변수가 다르며, 클래스 멤버 변수는 모든 객체에 속합니다. 선언했습니다(나 자신의 생각, tij의 이 부분을 방금 읽었습니다)

小葫芦

유형 삭제 후 일반 유형은 특정 클래스, 일반적으로 Object로 대체되므로 오류를 고려하지 않으면 삭제 후 클래스가

됩니다. 으아아아

전화시 주의사항

으아아아

Object 객체를 a에 할당하는 것과 동일하며 이는 허용되지 않으며 강제 변환이 필요합니다

'Code Universe'가 말한 것과 같습니다. getSingleInstance는 어떤 유형을 반환해야 할지 모르기 때문에 런타임에만 확인할 수 있으므로 이러한 방식은 문제가 있습니다.

小葫芦

모든 일반 클래스는 궁극적으로 동일한 기본 유형 클래스에 매핑되고 정적 속성은 클래스 수준에 있으므로 클래스와 인스턴스는 저장소를 공유하므로 하나의 저장소가 여러 유형의 속성을 수용할 수 없습니다. 정적 메서드에도 마찬가지입니다.

자세한 내용은 Java Generics: Type Erasure를 참조하세요

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿