【问题标题】:How can you pass a List<objects that implement an interface> to a method?如何将 List<objects that implement an interface> 传递给方法?
【发布时间】:2012-04-22 19:51:00
【问题描述】:

我有一个 servlet,其中包含几个从 DAO 获取对象列表、将列表转换为 JSON 并将其发送回响应中的方法。每个列表都由具有方法的对象组成:

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.
    }
}

但它无法编译。从 Oracle 查找一些文档后,您只能有 extends 而不是 implements 用于泛型参数。让所有类都继承自一个只有 getAsJson() 方法的抽象类在语义上没有意义(这些类是不相关的)。

我还没有找到关于 SO 的好的解决方案,或者只是在谷歌上搜索,所以任何帮助/见解都将不胜感激。

【问题讨论】:

  • 相切但你真的想自己构建 JSON 字符串吗?建议使用 Jackson 之类的库或其他库

标签: java generics inheritance abstraction


【解决方案1】:

为什么不直接使用

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

?

【讨论】:

  • 基于 OP 代码示例,您不能将 List&lt;User&gt; 参数传递给该函数。
  • @LuiggiMendoza 做到了。感觉如果我要经历将每个列表转换为 list 的麻烦,我还不如在那里做 JSON。不过我也有同样的想法。
  • @LuiggiMendoza 我明白了,谢谢。好像我错过了这一点。但是您仍然可以创建 List 并用 Users 填充它,然后将其传递给这样的方法。
  • @VadymS.Khondar 这是一个选项,但假设您的UserBuilder 类返回List&lt;User&gt;。您是否需要编写一个函数来将List&lt;User&gt; 转换为List&lt;JsonEnabled&gt; 并在每次调用getListAsJson 函数时使用它,如果您有更多实现JsonEnabled 的类,那将意味着更多方法来转换这些列表?
【解决方案2】:

对于通用通配符,关键字extends 对类和接口都有效:

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

extends 用于定义通用边界时的含义略有不同 - 它本质上翻译为“是,或扩展,或实现”。

【讨论】:

  • 谢谢!这就像一个魅力。我认为必须有一种方法可以做到这一点 - 既然你已经解释过了,我想我应该再次阅读文档,看看文档是否说同样的话。
  • 我希望我能给这么多+1 这正是我所需要的,现在我也明白了它的含义。
猜你喜欢
  • 1970-01-01
  • 2020-11-02
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多