Ошибка вывода типа. Ожидаемое несоответствие типов

#kotlin #generics #covariance

#kotlin #общие #ковариация

Вопрос:

Приведенный ниже код показывает ошибку. Ошибка вывода типа. Требуемое ожидаемое несоответствие типов: Response<BaseResponse<Any>>! найдено: Response<BaseResponse<RetriveUserInfoResponse>!>!

 `when`( mockIOnboardingService.validateCustomerIdentity(customerType.toLowerCase(), ValidateCustomerRequest(customerId, documentType, "243546", tyc)))
.thenReturn(Response.success(BaseResponse(payload = RetriveUserInfoResponse(" 5689765432")))) //--> Here the error
  

Это метод validateCustomerIdentity

 @POST(ApiConstants.bffOnboardingPath   ApiConstants.pathRetriveUserInfo)
    suspend fun validateCustomerIdentity(
        @Header(ApiConstants.headerXflowService) customerType : String,
        @Body body: ValidateCustomerRequest
    ): Response<BaseResponse<Any>>
  

Как вы можете видеть, он возвращается BaseResponse<Any> . Почему Android Studio показывает мне BaseResponse<RetriveUserInfoResponse>! ошибку

Это класс данных RetrieveUserInfoResponse

 data class RetriveUserInfoResponse(
    @SerializedName("phone")
    val phone: String
)
  

Ответ №1:

Эта проблема заключается в том, что Response.success(BaseResponse(payload = RetriveUserInfoResponse(" 5689765432"))) создается a Response<BaseResponse<RetriveUserInfoResponse>> , который не является тем же типом (или подтипом) Response<BaseResponse<Any>> .

Вы можете исправить это, приведя RetriveUserInfoResponse к Any :

 Response.success(BaseResponse(payload = RetriveUserInfoResponse(" 5689765432") as Any))
  

Или, альтернативно, путем изменения возвращаемого типа validateCustomerIdentity() to Response<out BaseResponse<out Any>> , который работает, поскольку Response<BaseResponse<RetriveUserInfoResponse>> является подклассом Response<out BaseResponse<out Any>> :

 @POST(ApiConstants.bffOnboardingPath   ApiConstants.pathRetriveUserInfo)
suspend fun validateCustomerIdentity(
    @Header(ApiConstants.headerXflowService) customerType : String,
    @Body body: ValidateCustomerRequest
): Response<out BaseResponse<out Any>>