19

DAOからオブジェクトのリストを取得し、そのリストをJSONに変換して、応答で送り返すいくつかのメソッドを備えたサーブレットがあります。すべてのリストは、次のメソッドを持つオブジェクトで構成されています。

public String getAsJson(){...}

また、サーブレットには、次のようなほとんど同じメソッドが多数あります。

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();
}

問題は、異なるDAOクエリを除いて、それとまったく同じように見える約6つのメソッド(および成長)があることです。私のアイデアは、getAsJson()メソッドの定義のみを持つインターフェースを作成し、各Beanにそれを実装させてから、そのインターフェースを実装するオブジェクトを取得する別のメソッドをサーブレットに含めることでした。このようになってしまいました:

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からいくつかのドキュメントを検索した後、ジェネリックパラメータの拡張のみを実行でき、実装はできません。getAsJson()メソッドを持つだけの抽象クラスからすべてのクラスを拡張することは意味的に意味がありません(クラスは無関係です)。

私はSOで良い解決策を見つけられなかったか、ただグーグルで回っているので、どんな助け/洞察もいただければ幸いです。

4

2 に答える 2

45

ジェネリックワイルドカードの場合、キーワードextendsはクラスとインターフェイスの両方で機能します。

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

extendsジェネリック境界を定義するために使用される場合、わずかに異なる意味を持ちます-それは本質的に「is、またはextends、またはimplements」に変換されます。

于 2012-04-10T13:56:37.857 に答える
3

なぜただ使用しないのですか

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

于 2012-04-10T14:02:49.100 に答える