我被迫使用无法更改签名的接口方法:
List parse(String path, Class clazz)
应该返回带有在clazz
参数中传递的类型的对象列表,例如:
List<TagsRun> runs = reader.parse(path, TagsRun.class)
我需要实现一个JSON解析器,问题是如何将clazz
参数的类型设置为结果列表?
我使用Gson,可能类似于:
List parse(String path, Class clazz) {
Type collectionType = new TypeToken<List<TagsRun>>(){}.getType();
List<TagsRun> myList = new Gson.fromJson(json, collectionType);
return myList
}
但是如何在此处用 List
我所做的唯一可行的解决方案是更改方法签名:
<T> List<T> parse(String path, Class<T[]> clazz ) {
T[] arr = new Gson().fromJson(new File(path).text(), clazz);
return Arrays.asList(arr);
}
换句话说,如何使用签名返回与clazz
参数类型相同的对象的列表:
List parse(String path, Class clazz)
谢谢。
答案 0 :(得分:1)
由于您无法更改方法的签名,因此返回带有类型参数的List毫无意义。
public List foo() {
ArrayList<String> strings = new ArrayList<>();
return strings;
}
public void methodUsingFoo() {
// possible but you should check if the assumption is correct:
List<String> uncheckedAssignment = foo(); // so don't do this
// this is what foo *will* return:
List actualResult = foo();
}
相反,您可以执行以下操作:
public void methodUsingParse() {
Class clazz = Object.class; // or whatever class you want or need
// this is what your method *will* return:
List actualResult = parse("/path/to/somewhere", clazz);
// best way would be to check each element:
for(Object element : actualResult) {
if (clazz.equals(element.getClass())) {
// do your stuff here
}
}
}
我忘记了什么: 我不认为有可能像您想的那样做。
答案 1 :(得分:0)
也许可以转换列表?
List<TagsRun> myList = new Gson.fromJson(json, collectionType);
List<Clazz> = Arrays.asList(myList.toArray(new Clazz[0]));
编辑: 我认为这可以为您提供帮助:https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection(java.util.Collection,%20java.lang.Class)-如果您没有注意到,请向下滚动至“列表”部分
答案 2 :(得分:0)
终于解决了:
@Override
List parse(String path, Class clazz) {
List result = []
JsonArray jsonArray = new JsonParser()
.parse(new File(path).getText(CHARSET))
.getAsJsonArray()
Gson gson = new Gson()
jsonArray.each {
result.add(gson.fromJson(it, clazz))
}
return result
}
诀窍是先获取一个数组,然后对每个数组项使用gson.fromJson(it, clazz)
。这会将数组中的每个json元素转换为POJO,然后将其添加到结果列表中。