Я не знаю, возможны ли типы гнезд, как я пытаюсь сделать:
Вот упрощенный код проблемы
Интерфейс
interface GroupRepository<T, F> {
fun save(): Kind<T, Group>
fun findAll() Kind<F, Group>
}
Реализация
class GroupRepositoryJpa(): GroupRepository<ForIO, IO<ForPage>> {
override fun findAll(): IO<PageK<Group>> {
val groups : Page<Group> = ...
return IO { groups.k() }
}
}
PageK.kt
class ForPageK private constructor() { companion object }
typealias PageKOf<A> = Kind<ForPageK, A>
@Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE")
inline fun <A> PageKOf<A>.fix(): PageK<A> = this as PageK<A>
data class PageK<A>(val page: Page<A>) : PageKOf<A>, Page<A> by page
fun <A> Page<A>.k(): PageK<A> = PageK(this)
При реализации функции findAll
, когда Я пытаюсь вернуть IO<PageK<Group>>
, компилятор сообщает мне Return type is 'IO<PageK<Group>>', which is not a subtype of overridden
Проблема в том, что я пытаюсь указать параметризованный интерфейс с Kind<F, Group>
, но в этом случае результат должен быть
IO -> PageK -> Group
, что отличается от того, что нужно компилятору
(IO) -> Group.
Есть ли способ достичь того, что я пытаюсь делать?
Заранее спасибо
ОБНОВЛЕНИЕ
В конце я сделал
Интерфейс
interface GroupRepository<T, F, G> {
fun save(): Kind<T, Group>
fun findAll() Kind<F, Kind<G Group>>
}
Реализация
class GroupRepositoryJpa(): GroupRepository<ForIO, ForIO, ForPageK> {
override fun findAll(): IO<PageK<Group>> {
val groups : Page<Group> = ...
return IO { groups.k() }
}
}