Не знаю почему, но я не могу вернуть класс данных, который реализует ожидаемый интерфейс.
интерфейс
interface AuthServiceResponse {
val statusCode: Int
val data: AuthServiceResponseData
val errors: List<AuthServiceResponseError>?
}
реализация
data class AuthServiceBasicResponse(override var statusCode: Int,
override var data: AuthServiceResponseData,
override var errors: List<AuthServiceResponseError>) : AuthServiceResponse
ожидается интерфейс AuthServiceResponse
@PostMapping
fun loginUser(@RequestParam username: String,
@RequestParam password: String): Mono<AuthServiceResponse> {
return authenticationService.loginUser(username, password)
}
метод, возвращающий класс AuthServiceBasicResponse, реализующий интерфейс AuthServiceResponse.
fun loginUser(username: String,
password: String): Mono<AuthServiceBasicResponse> {
...
}
омг да. Совсем забыл про дисперсию. Спасибо!





Просто для полноты опубликую здесь свое решение. Большое спасибо JB Nizet в комментариях выше за то, что указал мне правильное направление.
Чего я не учел, так это дисперсии при использовании дженериков.
Используя ключевое слово out, подклассы AuthServiceResponse могут использоваться в возвращаемом значении.
@PostMapping
fun createUser(@RequestParam username: String,
@RequestParam password: String): Mono<out AuthServiceResponse> {
return authenticationService.createUser(username, password)
}
У команды Kotlin есть хорошее объяснение здесь.
Пост, которым поделился JB Nizet здесь
Связанные: stackoverflow.com/questions/2745265/…, kotlinlang.org/docs/reference/…