2012-04-10 31 views
15

我有一個servlet,通過查詢參數傳遞,從DAO獲取對象列表,將列表轉換爲JSON,並將其發回給響應。每個列表由有方法的對象:如何將List <實現接口的對象>傳遞給方法?

public String getAsJson(){...} 

而且servlet有一堆看起來像大多張玉峯方法:

private String getUserListAsJson() { 
    List<User> userList = this.dao.getUsers(); 
    StringBuilder builder = new StringBuilder(); 
    builder.append('['); 
    // loops over the list appending the value of each objects getAsJson() 
    builder.append(']'); 
    return builder.toString(); 
} 

的問題是,我有大約6的方法(和不斷增長),除了不同的DAO查詢外,看起來完全一樣。我的想法是創建一個只有getAsJson()方法定義的接口,讓每個bean都實現它,然後在servlet中使用實現了該接口的對象的另一個方法。最終看上去像這樣:

public Interface JsonEnabled { 
    public String getAsJson(); 
} 

public class User implements JsonEnabled { 
    .... 
    @Override 
    public String getAsJson() {...} 
} 

public class TheServlet { 
    ... 
    private String getUserListAsJson() { 
     List<User> userList = this.dao.getUsers(); 
     return this.getListAsJson(userList); 
    } 
    private String getListAsJson(List<? implements JsonEnabled> list) { 
     // The loop code that is in each method. 
    } 
} 

所以,如果有人實際上已經讀到了這裏= P,即不編譯和仰視從Oracle一些文件後,你只能有延伸,而不是實現爲通用參數。使所有的類從一個只有getAsJson()方法的抽象類擴展到語義上沒有意義(類是無關的)。

我還沒有找到一個很好的解決方案,或只是谷歌搜索,所以任何幫助/見解將不勝感激。

+1

tangental,但你真的想自己建立JSON字符串嗎?建議使用像傑克遜或其他東西的圖​​書館 – 2012-04-10 13:58:38

回答

36

對於一般通配符關鍵字extends作品類和接口:

private String getListAsJson(List<? extends JsonEnabled> list) { ... } 

extends具有用於定義通用界限時略有不同的意義 - 它本質上轉化爲「爲,或擴展,或實現」。

+0

謝謝!這工作像一個魅力。我認爲必須有一種方法來做到這一點 - 猜測我應該再次閱讀文檔,現在你已經解釋了它,看看文檔是否說了同樣的事情。 – Windle 2012-04-10 14:13:41

+0

我希望我能給這麼多+ 1這正是我所需要的,現在我明白它的意思了。 – reidisaki 2017-09-18 18:01:20

3

爲什麼不只是使用

private String getListAsJson(List<JsonEnabled> list) { ... } 

+3

基於OP代碼示例,您不會將'List '參數傳遞給該函數。 – 2012-04-10 14:06:09

+1

@LuiggiMendoza釘了它。感覺就像我要經歷把每個列表投給列表的麻煩我可能只是在那裏做JSON。儘管我有同樣的想法。 – Windle 2012-04-10 14:10:12

+0

@LuiggiMendoza我明白了,謝謝。似乎我錯過了這一點。但是,您仍然可以創建列表並填充用戶,然後將其傳遞給此類方法。 – 2012-04-10 14:24:16

相關問題