diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt index a5f33c5..0117efb 100644 --- a/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt @@ -10,14 +10,22 @@ import java.time.LocalDateTime * Известный вам список ошибок */ sealed class ApiException(message: String) : Throwable(message) { - data object NotAuthorized : ApiException("Not authorized") - data object NetworkException : ApiException("Not connected") - data object UnknownException: ApiException("Unknown exception") + data object NotAuthorized : ApiException("Not authorized") { + private fun readResolve(): Any = NotAuthorized + } + + data object NetworkException : ApiException("Not connected") { + private fun readResolve(): Any = NetworkException + } + + data object UnknownException: ApiException("Unknown exception") { + private fun readResolve(): Any = UnknownException + } } class ErrorLogger { - val errors = mutableListOf>() + private val errors = mutableListOf>() fun log(response: NetworkResponse<*, E>) { if (response is Failure) { @@ -42,7 +50,10 @@ fun processThrowables(logger: ErrorLogger) { logger.dumpLog() } -fun processApiErrors(apiExceptionLogger: ErrorLogger) { +// Type mismatch: inferred type is ErrorLogger but ErrorLogger was expected +// fix: logger экземпляр ErrorLogger, и на входе ожидается Throwable вместо ApiException +// ApiException наследник Throwable, разрешение принимать в том числе и наследников дает модификатор "IN" +fun processApiErrors(apiExceptionLogger: ErrorLogger) { apiExceptionLogger.log(Success("Success")) Thread.sleep(100) apiExceptionLogger.log(Success(Circle)) diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt index 3018c40..58c5745 100644 --- a/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt @@ -9,19 +9,27 @@ import java.time.LocalDateTime /** * Network result */ -sealed class NetworkResponse { +// Type parameter T is declared as 'out' but occurs in 'invariant' position in type NetworkResponse +// fix: родитель должен иметь такой же модификатор OUT как и дочка +// Type mismatch: inferred type is Success but NetworkResponse was expected +// fix: второй параметр так же "OUT" для обобщенного типа как ковариантного +sealed class NetworkResponse { val responseDateTime: LocalDateTime = LocalDateTime.now() } /** * Network success */ -data class Success(val resp: T): NetworkResponse() +// Success - наследник без R, заменяем R на Nothing +// Type mismatch: inferred type is Success but NetworkResponse was expected +// fix: Any - предок для String, используем "OUT" для обобщенного типа как ковариантного +data class Success(val resp: T): NetworkResponse() /** * Network error */ -data class Failure(val error: R): NetworkResponse() +// Failure - наследник без T, заменяем T на Nothing +data class Failure(val error: R): NetworkResponse() val s1 = Success("Message") val r11: NetworkResponse = s1 @@ -42,4 +50,4 @@ val er4: NetworkResponse = e val er5: NetworkResponse = Failure(IllegalArgumentException("message")) -val message = e.error.message \ No newline at end of file +val message = e.error.message