3

JSON文字列を取り、モデルのArrayListを返すクラス「モデル」の静的ビルダーメソッドがあります。サブクラスがビルダーメソッドを継承できるように、モデルのコンストラクターを一般的に参照したいと思います。

public class Model
{
    protected int id;

    public Model(String json) throws JSONException 
    {
        JSONObject jsonObject = new JSONObject(json);
        this.id = jsonObject.getInt("id");
    }

    public static <T extends Model> ArrayList<T> build(String json) throws JSONException
    {
        JSONArray jsonArray = new JSONArray(json);

        ArrayList<T> models = new ArrayList<T>(jsonArray.length());

        for(int i = 0; i < jsonArray.length(); i++)
            models.add( new T(jsonArray.get(i)) )

        return models;
    }
}

これはクラスの単純化された実装であり、関連する行は次のとおりです。

models.add( new T(jsonArray.get(i)) )

これが不可能であることはわかっていますが、たまたま T 型のコンストラクターを呼び出すものを書きたいと思います。this() を使用しようとしましたが、メソッド「ビルド」が静的であるため、明らかに機能しません。リフレクションを使用して T のクラスを決定しようとしましたが、それを取得する方法を理解するのに途方に暮れていました仕事に。どんな助けでも大歓迎です。

ありがとう、

ロイ

4

2 に答える 2

1

ジェネリックを使用した「動的インスタンス化」の回避策は、クラスまたはメソッドにヒントを渡すことです。

public class Model<T> {
  Class<T> hint;
  public Model(Class<T> hint) {this.hint = hint;}

  public T getObjectAsGenericType(Object input, Class<T> hint) throws Exception {
    return hint.cast(input);
  }

  public T createInstanceOfGenericType(Class<T> hint) throws Exception {
    T result = hint.newInstance();
    result.setValue(/* your JSON object here */);
    return result;
  }
}

より多くのヘルプ/アイデアを提供できることをうれしく思いますが、テクニカル ソリューションで何を達成したいのかわかりません。

(注: 例には単純化しすぎた例外処理が含まれています)

于 2010-11-11T06:56:24.597 に答える
0

今の書き方では、build() の T 型パラメータが何の役にも立たないことがわかりません。それをドロップして、代わりにモデルを使用することはできませんか? もしそうなら、それはあなたの建設上の問題を解決するでしょう。

于 2010-11-11T06:41:04.950 に答える