2017-08-10 80 views
1

使用正式類型參數我知道,因爲「靜態上下文是依賴於類型參數,只一次所有實例我不能在泛型類的任何靜態上下文中使用的類型參數通用類型「。爲什麼java的允許靜態泛型方法

public final class X<T>{ 
    private static T field; // error 
    public static T getField(){return field; } // error 
} 

但我不明白爲什麼允許在靜態泛型方法中使用形式類型參數。

public final class X{ 
    public static <T> T getField(T t){ return t;} // Ok 
} 

靜態泛型方法中泛型類型參數和形式類型參數有什麼區別? 可以請你用例子解釋一下嗎? 非常感謝。

+0

形式類型參數*是*泛型類型參數。我不明白你在問什麼。 – shmosel

+1

請問您可以用示例來解釋這個[問題] –

+0

一個方法在您每次使用時都會獲取不同的類型參數;方法的一次調用和另一次調用同一方法之間沒有關係。對於領域,沒有人使用'T';對於方法,在方法調用位置分配「T」,每個方法使用不同的「T」。 –

回答

0

您可以定義有自己一套獨立的一個或多個類型參數,在這種情況下你有一個參數化方法,這也被稱爲泛型方法的方法。你可以在普通的類中擁有參數化的方法。泛型類型定義中的方法也可以有獨立的參數。

您可以修改listAll()方法,即參數化方法。以下是如何將看:

public static <T> void listAll(LinkedList<T> list) 
{ 
for(T obj : list) 
{ 
System.out.println(obj); 
} 
} 

牛逼公共靜態關鍵字是類型參數列表泛型方法。在這裏,你只有一個類型參數,T,但你可以有更多。該類型參數列表泛型方法始終尖括號中出現,並應遵循如公共靜態任何修飾,因爲你在這裏,而應先返回類型。

考慮其他的代碼片段,

public <E extends T> void add(E value) 
{ 
if(root == null) { // If there’s no root node 
root = new Node(value);   // store it in the root 
} 
else { // Otherwise... 
add(value, root); // add it recursively 
} 
} 

您還可以通過使用參數化方法獲得一些優勢。現在該方法具有獨立參數,E。所述的add()方法接受類型的參數Ť,這是類型參數。一般而言,您可能希望允許添加T的子類別。 add()方法接受任何類型的參數,類型爲TT的子類。這明顯增加了使用泛型類對象的靈活性。在這種情況下,您不需要更改方法的主體。所有的靈活性都是通過您定義方法參數的方式提供的。

我希望我的回答將是對你有幫助。

相關問題