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で良い解決策を見つけられなかったか、ただグーグルで回っているので、どんな助け/洞察もいただければ幸いです。