爲什麼我必須遵循靜態與所使用的通用類爲下面的一段代碼進行編譯?爲什麼你需要在JAVA中聲明一個無效的靜態方法簽名的泛型類型?
public static<Integer>void main(String args[]){
BinaryTree<Integer> tree = new BinaryTree<Integer>();
}
爲什麼我必須遵循靜態與所使用的通用類爲下面的一段代碼進行編譯?爲什麼你需要在JAVA中聲明一個無效的靜態方法簽名的泛型類型?
public static<Integer>void main(String args[]){
BinaryTree<Integer> tree = new BinaryTree<Integer>();
}
我只能假設你所要做的是定義一個BinaryTree
類,其節點類型爲Integer
,所以你寫了類似這樣的東西。
public class BinaryTree<Integer> {
// Code
public static void main(String args[]) {
BinaryTree<Integer> tree = new BinaryTree<Integer>();
}
}
在上面的代碼中,Integer
沒有它的通常含義。因爲它出現在類名後的尖括號中,所以它實際上是一個類型參數。通常,類型參數具有單字母名稱,但名稱爲Integer
是允許的。
由於main
方法是靜態的(屬於類,而不是類的單個實例),因此它無法訪問類型參數。這就是爲什麼main
的代碼不能編譯的原因。
通過編寫
publie static <Integer> void main(String args[])
相反,你可以將這個main
方法通用。該方法的類型參數(又稱爲Integer
!)隱藏該類的類型參數,並且編譯代碼。
爲了解決這個問題,你可以使類具有類型放慢參數T
,或者乾脆完全刪除類的類型參數(如果所有BinaryTree
實例有型Integer
,沒有必要爲類是通用的話)。
我想一個辦法,這可能編譯失敗可能是因爲你有這樣的事情
public class Test<Integer> {
public static<Integer> void main(String args []){
Map<Integer, String> aHash = new HashMap<Integer, String>();
}
}
並且使用的是「整數」作爲類型參數(這是合法的,雖然可能不是最好的辦法)
現在這樣的工作對於非靜態方法,即
public class Test<Integer> {
public void main(String args []){
Map<Integer, String> aHash = new HashMap<Integer, String>();
}
}
會很好地編譯,但對於靜態方法,不能使用類類型參數,因爲您會對非靜態類型參數進行靜態引用。
你不知道。你的假設是錯誤的。 – 2015-03-31 00:52:07
你的班級是否有機會開始'class BinaryTree {...' –
2015-03-31 01:03:42