У меня есть следующий класс:
abstract class FooTable<M, D> where M : IModel, D : IDto {
///...
fun getTableData(models: ArrayList<M>): ArrayList<D> {
// ...
}
}
И у меня есть другой класс, использующий его как:
abstract class FooPage<M, F> where M : IModel, F : IFilter {
abstract val table: FooTable<M, out IDto>
Затем где-то в моем коде я пытаюсь сделать:
page.table.getTableData(arrayListOf(m1, m2)).first()
И это дает мне:
Запроектированный тип FooTable<out IModel, out IDto>
запрещает использование public final fun getTableData(models: kotlin.collections.ArrayList<M> /* = java.util.ArrayList<M> */): kotlin.collections.ArrayList<D> /* = java.util.ArrayList<D> */
, определенного в com.menighin.example.models.FooTable
Вот скрипка с проблемой: https://pl.kotl.in/ryirJJH9m
Код:
interface IModel
interface IDto
interface IFilter
class Model : IModel
class Dto : IDto
class Filter : IFilter
class FooTable<M, D> where M : IModel, D : IDto {
fun getTableData(models: List<M>): ArrayList<D> {
return ArrayList()
}
fun testPage(masterModel: IModel, thisPage: FooPage<out IModel, out IFilter>) {
thisPage.table.getTableData(arrayListOf(masterModel)) // Error here
}
fun testTable(masterModel: IModel, masterTable: FooTable<out IModel, out IDto>) {
masterTable.getTableData(arrayListOf(masterModel)) // And error here
}
}
class FooPage<M, F> where M : IModel, F : IFilter {
val table: FooTable<M, out IDto> = FooTable()
}
fun main() {
val page = FooPage<Model, Filter>()
val a = page.table.getTableData(arrayListOf())
println("Hello, world!!!")
}
В моей FooTable
есть функция, в которой мне нужно получить ссылку на другую таблицуи получить его данные.Я думаю, я уже мог передать данные, но мне интересно, почему это не работает сейчас ...
Я понимаю из этот вопрос , что если бы я мог изменить abstract val table: FooTable<M, out IDto>
наabstract val table: FooTable<M, Any>
это было бы хорошо ... Но, насколько я знаю, я не могу, потому что определение FooTable
строго по второму параметру, реализующему IDto
.
Как я могу исправитьэто?