1. 程式人生 > >java為什麼不能在靜態域或方法中引用型別變數?

java為什麼不能在靜態域或方法中引用型別變數?

在《Java核心技術 卷I》中,提到“不能在靜態域或方法中引用型別變數”。示例程式碼如下:


       接著,下面的文字解釋說:如果這個程式能夠執行(也就是允許題目中所提的情況),就可以宣告一個Singleton<Random>共享隨機數生成器,宣告一個Singleton<JFileChoose>共享檔案選擇器對話方塊。但是,這個程式無法工作。型別擦除之後,只剩下Singleton類,它只包含一個singleInstance域。因此,禁止使用帶有型別變數的靜態域和方法。

      上面的解釋看得雲裡霧裡的,後來才似有所悟,大概的意思是這樣的吧:如果允許的話,由於靜態的域和方法都是可以被類直接呼叫的,所以上面的情況就會出現T隨時可能被修改的情況。打個比方,咱們設有類A 和 B,如果一個地方咱們呼叫Singleton<A>.getSingleInstance( ),得到的結果是A的物件a,如果後來又有一個地方,呼叫了Singleton<A>.getSingleInstance( ),那麼等到的結果是什麼呢? 還是A的物件a-----但咱們想得到的可是B的物件啊!   咱們再退一步,即使得到的是B的物件b,那麼,將會導致前面的引用變數a指向b(因為這是個單例模式),這也不是咱們所希望的。

網上有人說跟靜態的初始化有關,但我個人覺得似乎跟靜態初始化並無關係。因為咱們在呼叫這個類時,無論指定還是不指定T的型別,都不影響初始化吧?如果指定了,那就是T型別,如果沒指定,至少也有T的原型來發揮作用啊!

        再強調一遍。拋開這個例子,咱們單獨來看——為什麼不能定義靜態的泛型變數?

public class Pair<T> {
	
	public static T t;
	
}

如果允許,T就可能總是變化,Pair<String>、Pair<Integer>... ...,例如咱們想用Pair<String>去組成一個字串,結果T卻變成了Integer!

好了,不知道大家懂這個意思沒,其實我現在也是沒有完全懂。如有更好的解釋,歡迎大家在下面的評論裡補充。