У меня есть это простое расширение Kotlin для Wrapper. Я пытаюсь создать Output<T>
(запечатанный класс) из Wrapper<T>
, но получаю несоответствие типов ошибка
Здесь я добавляю весь необходимый код
sealed class Output<T> {
data class WantedOutput<T>(val value: T): Output<T>()
data class UnwantedOutput<T>(val error: Throwable) : Output<T>()
}
interface Data {
val id: String
val name: String?
val age: Int?
}
data class ResponseData(
override val id: String,
override val name: String?,
override val age: Int?
) : Data
data class Wrapper<T>(val result: T)
fun <T> Wrapper<T>.convert() : Output<T> {
return Output.WantedOutput(result)
}
interface Provider {
fun getData(): Wrapper<ResponseData> // THIS MUST BE THE IMPLEMENTATION
}
class Test {
// THE RETURN TYPE MUST BE THE INTERFACE
fun test(): Output<Data> {
val wrapper = Wrapper(ResponseData("ID", "ISAAC", 26))
return Output.WantedOutput(wrapper.result)
}
fun test(provider: Provider): Output<Data> {
return provider.getData().convert() // THIS FAILS
}
}
Как сделать так, чтобы это расширение соответствовало правильному типу? Проблема в том, что Wrapper<T>
не является (точно) того же типа Output<T>
. T from Output - это интерфейс, а T from Wrapper - это реализация. Можно ли сказать системе типов принять это?