Kotlin 函数 return 具有来自两种不同数据类型的任何一种 return 类型,而没有将 Any 指定为 return 类型?

Kotlin function return with any one return type from two different data type without specifying Any as a return type?

我想允许这两种 return 类型中的任何一种 (ApiResponse || ErrorResponse)。但是 Return Type 不应该是对象或 Any。

fun getAllUser() : Any? {
    val flag = true
    return if(flag){
        ApiResponse(true)
    } else {
        ErrorResponse(500)
    }
}

使用 return 类型(任何),无法编写扩展函数来使用两种不同的 return 类型执行特定操作。我要指定两个响应。

In My case, I want to write different Extension function for ApiResponse &  ErrorResponse class. 

Is it possible to return either ErrorResponse or ApiResponse in a same function?

我想 return 在同一函数中使用 ErrorResponse 或 ApiResponse。

通过使用 [Λrrow][1] 库,我可以实现如下功能。

fun getAllUser() : Either<ErrorResponse,ApiResponse>? {
    val flag = true
    ResponseEntity(ErrorResponse(500),HttpStatus.INTERNAL_SERVER_ERROR)
    ResponseEntity.internalServerError().build<ErrorResponse>()
    val response: Either<ErrorResponse,ApiResponse> = return if(flag){
        Either.right(ApiResponse(true))
    } else {
        Either.left(ErrorResponse(500))
    }
    return response
}

我建议使用 Result class。要么是 Kotlin 提供的,要么是您自己的实现更好。 Here 是使用自定义实现的示例之一,以及说明。这应该为您提供所需的所有信息。

创建一个您的 类 实现的密封接口:

sealed interface Response<out T>
data class ApiResponse<T>(val data: T): Response<T>
data class ErrorResponse(val errorCode: Int): Response<Nothing>

fun getAllUser() : Response<Boolean> {
    val flag = true
    return if(flag){
        ApiResponse(true)
    } else {
        ErrorResponse(500)
    }
}

然后您可以编写处理任一类型的扩展函数:

fun Response<Boolean>.foo() {
    when (this) {
        is ApiResponse<Boolean> -> { TODO() }
        is ErrorResponse -> { TODO() }
    }
}

在此 when 语句的分支内,输入将被智能转换为适当的类型。