2012-04-10 55 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

相关问题