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

书里面这么写的:

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 が静的ではなく、インスタンス変数とメソッドである場合、現時点ではどの型を返す必要があるかが明らかであるため、問題はありません。 リーリー

いいねを押す +0
大家讲道理

ジェネリックはクラス オブジェクトによってのみ使用できます。ジェネリックは <> によって宣言および初期化されます。したがって、クラス メンバー変数はすべてのオブジェクトに属します。宣言しました (私自身、いくつかの考えがありますが、tij のこの部分を読み終えたところです)

いいねを押す +0
小葫芦

型の消去後、ジェネリック型は特定のクラス (通常は Object) に置き換えられるため、エラーが考慮されない場合、消去後のクラスは

になります。 リーリー

電話をかけるときの発言

リーリー

これは Object オブジェクトを a に代入することと同じですが、これは許可されておらず、強制的な変換が必要です

これは「Code Universe」が言っているのと同じです。getSingleInstance は実行時にのみ確認できるため、この書き方には問題があります。

いいねを押す +0
小葫芦

すべてのジェネリック クラスは最終的に同じプリミティブ型クラスにマップされ、静的プロパティはクラス レベルで存在するため、クラスとインスタンスはストレージを共有するため、1 つのストレージで複数の種類のプロパティを収容できません。静的メソッドについても同様です。

詳細については、「Java ジェネリック: 型消去」を参照してください

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート