在密封类中返回相同类型的方法
我有一个密封类:
sealed interface ResponseResult<out T> {
data class Ok<T>(val value: T) : ResponseResult<T>
data class Response(val response: ResponseEntity<Any>) : ResponseResult<Nothing>
}
我的目标是在两种情况下都返回一个 ResponseEntity<Any> 的方法。只有当 Ok<T> = Ok<ResponseEntity<Could Be Anything>> 时,这个方法才有可能实现。
我知道在Swift/Rust中,可以写一个条件性实现的方法:只有当T 实现/符合某个特定类型时才可用的方法(在本例中为:ResponseEntity)。我在想Kotlin里是否也有类似的写法。ResponseEntity 在 Ok 情况下可以容纳一个 Any 的子类。
解决方案
是的,Kotlin也有扩展函数/属性。扩展函数/属性可以带类型参数,且这些类型参数也可以有约束。
你可以这样写:
val <T: ResponseEntity<*>> ResponseResult<T>.responseEntity
get() = when (this) {
is ResponseResult.Ok<T> -> this.value
is ResponseResult.Response -> this.response
}
responseEntity 的类型将是 ResponseEntity<*>。如果你希望类型是 ResponseEntity<Any>,那么 ResponseEntity 相对于 T 需要是协变的(out),并且类型约束可以是:
val <T: ResponseEntity<Any>> ResponseResult<T>.responseEntity
// ^^^^^
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。