第一个代码:
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();
}
第二
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();
}
我正在考虑提取一种涵盖这两个代码的方法。我认为该方法应该或多或少看起来像这样:
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()?
答案 0 :(得分:1)
您可以使用以下语法来使用带参数的构造函数(我假设构造函数的参数是JSONObject
并且构造函数是公共的 - 如果不是,请使用getDeclaredConstructor
方法):
Class<Announcement> cls = Announcement.class; //the second argument of your method
objects[i] = cls.getConstructor(JSONObject.class).newInstance(json);
答案 1 :(得分:1)
您可以使用泛型来提供类型安全并避免使用石头,但您必须返回List。
static <T> List<T> getObjectsArray(String jsonString, Class<T> cls) {
...
}
如果 Announcement 和 Bound 之间有一个通用类型(接口),那么绑定泛型类型会很好:
static <T extends YourSuperType> ...