Я написал приложение Java, где данные были получены из API в JSON. В зависимости от конечной точки фактические данные могут быть очень разными. Поэтому я сделал функцию для преобразования данных в требуемый класс для каждого возможного класса. Это дает мне несколько функций, которые отличаются только по классу, в который нужно конвертировать. Ниже приведены два примера:
public List<ZermeloBranch> processBranches(ZermeloApiResponseObject responseObject) {
List<ZermeloBranch> branches = new ArrayList<>();
List<LinkedTreeMap> branchMaps = responseObject.getData();
Gson gson = new Gson();
for (LinkedTreeMap treeMap : branchMaps) {
branches.add(gson.fromJson(gson.toJsonTree(treeMap).toString(), ZermeloBranch.class));
}
return branches;
}
public List<ZermeloAnnouncement> processAnnouncements(ZermeloApiResponseObject responseObject) {
List<ZermeloAnnouncement> announcements = new ArrayList<ZermeloAnnouncement>();
List<LinkedTreeMap> announcementMaps = responseObject.getData();
Gson gson = new Gson();
for (LinkedTreeMap treeMap : announcementMaps) {
announcements.add(gson.fromJson(gson.toJsonTree(treeMap).toString(), ZermeloAnnouncement.class));
}
return announcements;
}
Теперь я переписываю это приложение в Kotlin, и я полагаю, что должна быть возможность написать одну функцию для обработки данных, передающих класс для декодирования в качестве параметра. Поэтому я сделал наследование ZermeloBranch и ZermeloAnnouncement от ZermeloDataObject. Я хотел бы написать одну функцию, подобную этой:
fun processDataToList(data:JSONArray, convertToClass:KClass<out ZermeloDataObject>):List<KClass<out ZermeloDataObject>>{
val returnList:ArrayList<KClass<out ZermeloDataObject>> = arrayListOf()
val gson = Gson()
for (item in 0 until data.length()){
returnList.add(gson.fromJson(item, convertToClass))
}
return returnList
}
и вызвать ее с помощью processDataToList(data, ZermeloAnnouncements::class)
и получить List<ZermeloAnnoucement>
возвращенный результат вызова с processDataToList(data, ZermeloBranch::class)
и получить возвращенный List<ZermeloBranch>
. Увы, компилятор выдает мне ошибку на gson.fromJson, утверждая, что «ни одна из следующих функций не может быть вызвана с предоставленными аргументами», а затем перечисляет все возможные функции.
Можно ли использовать одну функцию как Iпредложите, и если да, что я делаю не так?