2011-05-20 20 views
0

這麼長的故事短我有一個對象模型,其中幾個不同的實體類型共享一個共同的超類型。從這個超類型派生的任何類型都擁有與之相關的User,並且我想提供一個通用實用程序函數,該函數可以返回屬於指定User的給定類型的所有實體。Java - 正確聲明通用函數的方法?

所有這一切工作正常,但我的函數聲明如下:

public static <T> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 

...雖然這是由編譯器所接受,語法看起來有點怪我。這是用泛型返回類型聲明函數的正確方法嗎?理想的情況是什麼,我想有更多的東西,如:

public static List<T> findByUser(Class<T extends MySuperClass> entityClass, User user, EntityManager em) 

但是編譯器不喜歡,在所有。所以,我的具體問題是:

  1. 有什麼辦法static後襬脫看似虛假<T>元素?
  2. 我需要用什麼語法使編譯器強制執行T必須從我的超類類型派生?

回答

1
public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 

應該工作。

方法簽名中需要<T extends MySuperClass>(在static之後),因爲這是定義類型T的邊界的地方。

1

<T>在static告訴編譯器該函數應該是通用的並且允許你在其中設置約束之後。

public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 
1

你想這樣的:

public static <T extends MySuperClass> List<T> findByUser(Class<T> entityClass, User user, EntityManager em) 

的「虛假」 <T>(或現在<T extends MySuperClass>)是在方法簽名中使用泛型類型參數(一個或多個)的聲明(返回和參數類型)。

基本上,簽名現在說「調用此方法總是涉及一類T擴展MySuperClass,並且第一個參數必須是一個Class對象,表示T,並且返回類型將是一個List<T>