1

最初のコード:

    Bond[] bonds = null;
    try
    {
        JSONArray jsonArray = new JSONArray(result);
        bonds = new Bond[jsonArray.length()];
        for (int i = 0; i < jsonArray.length(); i++)
        {
            JSONObject json = jsonArray.getJSONObject(i);
            bonds[i] = new Bond(json);
        }
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }

2番:

    Announcement[] announcements = null;
    try
    {
        JSONArray jsonArray = new JSONArray(result);
        announcements = new Announcement[jsonArray.length()];
        for (int i = 0; i < jsonArray.length(); i++)
        {
            JSONObject json = jsonArray.getJSONObject(i);
            announcements[i] = new Announcement(json);
        }
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }

この 2 つのコードをカバーする方法を抽出することを考えています。メソッドは多かれ少なかれ次のように見えるはずだと思います:

static Object[] getObjectsArray(String jsonString, Class<?> cls)
{
    Object[] objects = null;
    try
    {
        JSONArray jsonArray = new JSONArray(jsonString);
        objects = (Object[]) Array.newInstance(cls, jsonArray.length());
        for (int i = 0; i < jsonArray.length(); i++)
        {
            JSONObject json = jsonArray.getJSONObject(i);
            objects[i] = new Announcement(json); // FIXME: How to pass "json" arg to the constructor with cls.newInstance()?
        }
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    return objects;
}

そのため、後で最初のコードの代わりに を呼び出すことができますBond[] bonds = (Bond[]) getObjectsArray(jsonArray, Bond)

これは最も問題のある行です:

objects[i] = new Announcement(json); // FIXME: How to pass "json" arg to the constructor with cls.newInstance()?
4

2 に答える 2

1

ジェネリックスを使用して型の安全性を提供し、キャストを回避できますが、リストを返す必要があります。

static <T> List<T> getObjectsArray(String jsonString, Class<T> cls) {
        ... 
}

アナウンスバウンドの間に共通のタイプ(インターフェース)がある場合は、次のようにジェネリック型をバウンドすると便利です。

static <T extends YourSuperType> ...
于 2012-08-07T13:17:50.447 に答える
1

次の構文を使用して、引数付きのコンストラクターを使用できます (コンストラクターの引数は aJSONObjectであり、コンストラクターは public であると想定しています。そうでない場合は、getDeclaredConstructorメソッドを使用します)。

Class<Announcement> cls = Announcement.class; //the second argument of your method
objects[i] = cls.getConstructor(JSONObject.class).newInstance(json);
于 2012-08-07T13:01:45.200 に答える