书里面这么写的:
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
すべてのジェネリック クラスは最終的に同じプリミティブ型クラスにマップされ、静的プロパティはクラス レベルで存在するため、クラスとインスタンスはストレージを共有するため、1 つのストレージで複数の種類のプロパティを収容できません。静的メソッドについても同様です。
詳細については、「Java ジェネリック: 型消去」を参照してください