2012-10-31 90 views
7

使用Java: 我不想浪費人們的時間並在此發佈,但是我的搜索技巧失敗了,我找不到答案。我一直在尋找通過一些提供的代碼,他們使用Java關於<E>使用公共靜態<E> void

public static <E> void printTree(TwoFourTree<E> tf) 

(參考我們從一個紅黑樹轉換爲雙四樹)。當我第一次接觸到這個問題的時候,我會用的初始方法聲明來代替甚至不包含這個問題。然而,我遇到了問題,並拋出這個<E>解決了我所有的問題,儘管使用<Integer>而不是其他地方的<E>

所以我的問題是,能有人請向我解釋完全<E>做什麼

public static <E> void 
+1

這是一個泛型類型參數。請參閱http://docs.oracle.com/javase/tutorial/java/generics/ –

回答

3

這是被稱爲Generics一個Java功能。

爲什麼要使用泛型?那麼,以下給出了一個他們有用的場景。回到「糟糕的舊時代」,如果你想有一個可以處理任何對象的類,你必須聲明所有對象的接口,例如

public class MySuperList 
{ 
    public void Add(object a) { } 
} 

然而,這太爛了,因爲你沒有的類型安全 - 你可以寫類似下面的代碼:允許你強鍵入類

// Your code 
MySuperList list = new MySuperList(); 
cars.Add(new Car("Ford Mondeo"));// Works 
cars.Add(new Fish("Herring")); // Works - which is a shame as a Fish is not a car! 

泛型修復了這個,但以通用的方式。例如:

public class MySuperList<T> 
{ 
    // Add method will only accept instances of type T. 
    public void Add(T a) { } 
} 

// Your code 
MySuperList<Cars> list = new MySuperList<Cars>(); 
cars.Add(new Car("Ford Mondeo"));// Works 
cars.Add(new Fish("Herring")); // Compile-time error. 
+1

只是一個技術性的東西,但方法名稱通常以小寫字母開頭。 – arshajii

+1

對不起 - 我是交易的c#程序員;) –

0

它創建了一個泛型方法;即它允許你使用一個TwoFourTree來保存任何類型的對象作爲你的參數(在這種情況下)。

如果,例如,希望只接受TwoFourTree s表示持有List類型的對象,你會定義方法

public static <E extends List> void ... 

如果你想只Number對象(IntegerDouble等),你會做

public static <E extends Number> void ... 

這是創建這樣的方法實際上可能有用的原因。我要指出的是樂趣並沒有結束,您可以用多種類型的參數做同樣的,例如:

public static <T, S extends Number> void ... 

我想你可能會發現它有利於在泛型方法讀取this教程,如果你」喜歡學習更多。

0

而是寫

public static Integer ... 
public static Double ... 
public static Long ... 

的...

你要做的就是創建泛型方法

public static <E> 
+2

您無法編寫'Integer void'方法可能會導致整數或無效。請編輯或刪除您的答案。 –

+0

什麼愚蠢的初學者錯誤:)感謝注意它。 – elrado