gpt4 book ai didi

kotlin - 如何在 kotlin` 中使用带有泛型的密封类

转载 作者:行者123 更新时间:2023-12-02 01:31:02 28 4
gpt4 key购买 nike

我有以下类(class),但我正在为泛型而苦苦挣扎


sealed class Result<T,E> {
data class Success<T>(val data: T): Result<T,Void>()
data class Failure<E>(val error: E): Result<Void,E>()
}


fun interface SeqListener<T,E> {
fun onComplete(result: Result<T,E>)
}

abstract class Seq<T,E> {

var started = false
private set

var complete = false
private set

private lateinit var seqListener: SeqListener<T,E>

fun start(listener: SeqListener<T,E>) {
if (!started) {
seqListener = listener
started = true
return doStart()
} else throw IllegalStateException("cannot call start on a sequence more than once")
}

fun success(result: Result.Success<T>) {
complete(result)
}

fun fail(result: Result.Failure<E>) {
complete(result)
}

private fun complete(result: Result<T,E>) {
if (!complete) {
complete = true
seqListener.onComplete(result)
} else throw IllegalStateException("cannot call success or fail multiple times")
}

abstract fun doStart()
}

但编译器提示调用:complete(result)上面的失败/成功属于错误类型 Required: Result<T,E> Found: Result.Success<T>对于成功者。

如果我更改 complete方法:complete(result: Result<*,*>)然后这些错误消失了,但是调用了seqListener.onComplete(result)失败 Required: Result<T,E> Found: Result<*,*>

如有任何帮助,我们将不胜感激。

最佳答案

将您的类型定义为out 并为未使用的类型使用Nothing。这将使编译器对可接受的向上转换非常宽松。

Nothing 类型可以被认为是Any 的对立面,因为它在逻辑上被视为所有内容的子类型。所以对于协变的 out 类型,它可以隐式地向上转换为任何东西。

sealed class Result<out T, out E> {
data class Success<T>(val data: T): Result<T, Nothing>()
data class Failure<E>(val error: E): Result<Nothing, E>()
}

关于kotlin - 如何在 kotlin` 中使用带有泛型的密封类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73280747/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com