У меня есть небольшая проблема с созданием абстракций в моем проекте, написанном на Kotlin. Допустим, у меня есть интерфейс
interface IInterface<A : Any, B> where B : IInterface<A, B> {
fun doSomething(someData: A): B
}
Все, что меня волнует в типе B, заключается в том, что он реализует интерфейс IInterface и возвращается функцией doSomething этого интерфейса. Первый очевидный выбор - предоставить B в качестве общего параметра.
То, чего я хочу достичь, это что-то вроде этого:
class MyClass<A : Any, B>(val value: String) : IInterface<A, B> where B : MyClass<A, B> {
override fun doSomething(someData: A): B = MyClass(someData.toString())
}
где переопределенная функция возвращает объект типа, который ограничен типом самого класса.
К сожалению, по какой-то причине компилятор жалуется, что возвращаемое значение переопределенной функции - не B, а MyClass, даже если я ограничил B типом MyClass.
Я что-то пропустил? Может быть, какая-то магия дисперсии?
Вероятно, есть веская причина для того, чего я не вижу. Но как к этому подойти?
Другая проблема, с которой я, скорее всего, столкнусь, это конструктор, который будет использоваться вне экземпляра Myclass.
val aMyClassInstance = MyClass<A, ??? >( "a value" )
Я полагаю, что это можно сделать способом Scala с помощью библиотеки Arrow, но сначала я хотел бы выяснить, возможно ли решение Kotlin без мошенничества.