2012-04-10 19 views
15

私は、クエリパラメータに渡されたDAOからオブジェクトのリストを取得し、リストをJSONに変換して返信するサーブレットを持っています。すべてのリストは、法持つオブジェクトで構成されていますList <インターフェイスを実装するオブジェクト>をメソッドに渡すにはどうすればよいですか?

public String getAsJson(){...} 

をし、サーブレットは次のようになり、ほとんどindentical方法の束を持っています

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にそれを実装させ、サーブレットにそのインターフェイスを実装したオブジェクトを持つ別のメソッドを持たせることでした。このように見てしまった:誰もが実際にこのはるか= Pを読み取った場合、コンパイルされないこと、およびOracleからいくつかのドキュメントを検索した後、あなただけなく実装を拡張することができますので、

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

ジェネリックパラメータの場合すべてのクラスを抽象クラスから継承することは、getAsJson()メソッドだけで意味が分かりません(クラスは無関係です)。

私はSOの良い解決策を見つけたり、まさにグーグルグーグルではないので、どんな助けや洞察力もありがとうございます。

一般的なワイルドカードについては
+1

tangentalしかし、実際にJSON文字列を自分で作成したいですか?ジャクソンなどの図書館を使用するように提案する –

答えて

36

キーワードクラスとインタフェースの両方のためのextends作品:一般的な境界を定義するために使用された場合

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

extendsは若干異なる意味を持っている - それは、本質的に「ある、または拡張し、または実装」に変換されます。

+0

ありがとう!これは魅力的に機能しました。私はこれを行う方法がなければならないと思った - あなたはそれを説明し、ドキュメントが同じことを言っているかどうかを見て、ドキュメントをもう一度読まなければならないと思う。 – Windle

+0

私はこれに多くの+1を与えることができたらいいと思います。これはまさに私が必要としていたものです。今はそれが意味することも理解しています。 – reidisaki

3

理由だけ

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

を使用していませんか?

+3

OPコードサンプルに基づいて、その関数に 'List 'パラメータを渡すことができません。 –

+1

@ LuigiMendozaはそれを釘付けにした。各リストをリストにキャストするのが難しい場合は、のように感じてください。そこにはJSONだけでもいいかもしれません。私は同じ考えを持っていた。 – Windle

+0

@ LuigiMendoza私は、ありがとう、ありがとう。私はこの点を逃したようだ。しかし、あなたはまだリストを作成し、それをユーザで埋めて、そのようなメソッドを渡すことができます。 –

関連する問題