2014-08-27 70 views
0

我有一種方法在使用本機查詢時爲枚舉值列表的in子句構建SQL。問題是,我不知道如何使它與一個特定的枚舉列表,只有一個通用的。傳遞具有泛型的枚舉的列表

這裏是方法:

public static String toDbInClauseEnum(final List<Enum<?>> pEnums) 
{ 
    if (pEnums == null || pEnums.isEmpty()) 
    { 
     throw new IllegalArgumentException("Null or empty list passed to method."); 
    } 

    StringBuilder inClause = new StringBuilder(); 
    inClause.append("("); 
    boolean addComma = false; 
    for (Enum<?> e : pEnums) 
    { 
     if (addComma) 
     { 
      inClause.append(",'" + e.name() + "'"); 
     } 
     else 
     { 
      inClause.append("'" + e.name() + "'"); 
      addComma = true; 
     } 
    } 
    inClause.append(")"); 
    return inClause.toString();    
} 

如果我試圖通過枚舉值的常規列表,如

List<EventType> 

我得到的錯誤:

The method toDbInClauseEnum(List<Enum<?>>) in the type DatabaseUtil is 
not applicable for the arguments (List<EventType>) 

我不不知道我想定義我以通用的方式傳遞給這個方法的列表,因爲這留下了出錯的空間,但是我不能找出如何解決這個錯誤。

我已經四處搜尋並嘗試了一些不同的東西,但沒有一個直接解決這個問題,所以我不確定從這裏去哪裏。

+1

使其論點'名單<?擴展枚舉>'? – Ordous 2014-08-27 16:26:46

回答

1
public static String toDbInClauseEnum(final List<? extends Enum<?>> pEnums){ 

或者

public static <E extends Enum<E>> String toDbInClauseEnum(final List<E> pEnums){ 
+0

感謝@Volune,似乎都有效,但我喜歡第二個,因爲在Eclipse中,我仍然收到警告?由於Enum是一種原始類型,因此擴展了Enum。 – user1987703 2014-08-27 16:45:29

+0

是的,因爲正確的形式是'List <?擴展Enum >'爲第一個變體。 '名單<?擴展枚舉>'使用原始類型'枚舉',因此警告。 – Holger 2014-08-27 17:59:57

2

儘管EventTypeEnumList<EventType>不是List<Enum<?>>,因爲Java的泛型是不變的。

變化toDbInClauseEnum簽名以包括一個上限通配符:

//            vvvvvvvvv 
public static String toDbInClauseEnum(final List<? extends Enum<?>> pEnums) 

這將工作,因爲通配符允許一個子類型,例如EventType,作爲泛型類型參數。

+0

我也測試了這個答案,它工作正常。謝謝@rgettman – user1987703 2014-08-27 16:46:16