ホームページ  >  に質問  >  本文

java核心技术 卷1里面泛型一章中“泛型类的静态上下文中类型变量无效”这一节不能理解

书里面这么写的:

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

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

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

ringa_leeringa_lee2765日前906

全員に返信(4)返信します

  • 阿神

    阿神2017-04-17 17:11:31

    まず、このメソッドをどのように使用するかを考えてください:

    AType a = Singleton.getSingleInstance();

    問題は、上記の getSingleInstance は返すべき型をどのようにして知るのでしょうか?したがって、この使用法は許可されません。

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

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:11:31

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

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 17:11:31

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

    になります。 リーリー

    電話をかけるときの発言

    リーリー

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

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

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 17:11:31

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

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

    返事
    0
  • キャンセル返事