クエリパラメータに渡され、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.
}
}
したがって、これまでに実際に= Pを読んだことがある場合、コンパイルは行われず、Oracleからいくつかのドキュメントを調べた後、拡張のみが可能で、ジェネリックパラメータの実装はありません。getAsJson()メソッドのみを含む抽象クラスからすべてのクラスを拡張することは、意味的に意味がありません(クラスは無関係です)。
私はSOで適切な解決策を見つけられなかったか、単にグーグルで回っていないので、ヘルプ/洞察をいただければ幸いです。
一般的なワイルドカードの場合、キーワードextends
はクラスとインターフェースの両方で機能します。
private String getListAsJson(List<? extends JsonEnabled> list) { ... }
extends
一般的な境界を定義するために使用する場合、少し異なる意味があります。これは、本質的に「is、extend、またはimplements」に変換されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加