Crear método con un parámetro genérico para acciones repetidas

Tengo los siguientes methods en mi código:

fun saveArticles(data: JSONArray) { var active = String() for (i in 0..data.length().minus(1)) // create string val articles = Select.from(Article::class.java).list() val iterator = articles.iterator() while (iterator.hasNext()) { val article = iterator.next() as Article if (!active.contains(Regex(article.id.toString()))) article.delete() } } fun saveDossiers(data: JSONArray) { var active = String() for (i in 0..data.length().minus(1)) // create string val dossiers = Select.from(Dossier::class.java).list() val iterator = dossiers.iterator() while (iterator.hasNext()) { val dossier = iterator.next() as Dossier if (!active.contains(Regex(dossier.id.toString()))) dossier.delete() } } fun saveVideos(data: JSONArray) { var active = String() for (i in 0..data.length().minus(1)) // create string val videos = Select.from(Video::class.java).list() val iterator = videos.iterator() while (iterator.hasNext()) { val video = iterator.next() as Video if (!active.contains(Regex(video.id.toString()))) video.delete() } } 

Como puede ver, todos los methods hacen exactamente lo mismo. La única diferencia es el tipo de class del object en el que estoy trabajando en este momento. ¿De alguna manera puedo crear un solo método con un parámetro del tipo Clase y, dependiendo del tipo, cambiar la class que necesito para trabajar? Algo como esto:

 fun saveVideos(data: JSONArray, type: Class) { var active = String() for (i in 0..data.length().minus(1)) // create string val list = Select.from(type).list() val iterator = list.iterator() while (iterator.hasNext()) { val item = iterator.next() as type if (!active.contains(Regex((item as type).id.toString()))) item.delete() } } 

    Debe extraer una interfaz y usar un genérico reified .

     interface Blabla { fun delete() val id: Int } inline fun <reified T : Blabla>saveVideos(data: JSONArray) { var active = String() for (i in 0..data.length().minus(1)) // create string val list = Select.from(T::class.java).list() val iterator = list.iterator() while (iterator.hasNext()) { val item = iterator.next() as T if (Regex(item.id.toString()) !in active) item.delete() } } 

    Esto debería funcionar.

    Además, le recomiendo que use la biblioteca de collections de Kotlin, así.

     inline fun <reified T : Blabla>saveVideos(data: JSONArray) { val active = "" for (i in 0 until data.length()) {} // create string val list = Select.from(T::class.java).list() list .map { it as T } .filter { Regex(it.id.toString()) !in active } .forEach { it.delete() } } 

    E incluso puedes replace por forEach { it.delete() } con forEach(T::delete)