2011-04-27 61 views
0

我不知道如何給這個更好的標題,因爲我真的不知道這種模式在Java中被稱爲什麼。Java中的通用方法

現在我有這個簽名的方法:

public Directory getDirectory(Class<? extends Directory> type) { ... } 

你這樣稱呼它:

MyDirectory directory = (MyDirectory)getDirectory(MyDirectory.class); 

該類型的約束確保MyDirectory必須從Directory派生。

我真正想要做的就是避免轉換並減少所需的代碼量。在C#中你可以說:

MyDirectory directory = getDirectory<MyDirectory>(); 

有沒有辦法做到這一點或類似的Java?自1.4版以來我沒有編寫任何Java代碼!

回答

11
public <T extends Directory> T getDirectory(Class<T> type) { ... } 

MyDirectory directory = getDirectory(MyDirectory.class); 
+0

由於擦除,這是最好的選擇。 – pickypg 2011-04-27 15:15:48

+0

非常感謝。我正是減去自己是在'T'作爲返回類型,我想通了牙套返回類型,它們實際上只是一個約束呢? – 2011-04-27 15:16:00

+1

@Drew:「」爲泛型方法定義了類型參數「T」 od ...即使你沒有給出特定的邊界(比如'extends Directory'),你也必須爲任何泛型方法聲明該聲明。 – ColinD 2011-04-27 15:18:14

4

嗯,你可以通過改變方法本身是通用避免投:

public <T extends Directory> T getDirectory(Class<T> type) 

然後:

MyDirectory directory = getDirectory(MyDirectory.class); 

這裏,我們使用類型推斷從參數確定T的類型。

但是,你必須通過在Class<T>,否則類型擦除會踢,這個方法不知道類型來創建:(

一個實例類型擦除的更多細節,只是約一切做Java泛型,看安格朗格Java Generics FAQ

+0

感謝Jon,我會閱讀那個FAQ。 – 2011-04-27 15:20:44