在Kotlin中使用泛型和星星投影

tjrkku2a  于 11个月前  发布在  Kotlin
关注(0)|答案(3)|浏览(122)

我有以下界面

sealed interface Resource<out T> {
    data class Success<T>(val data: T?) : Resource<T>
    data class Error(val throwable: Throwable) : Resource<Nothing>
}

字符串
我在一个用例中这样使用它

suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<Any> {
        return try {
            val translatedText = translationClient.translate(...)
            Resource.Success(translatedText)
        }
        catch (translationException: TranslationException) {
            Resource.Error(translationException)
        }
    }


我在一个视图模型中使用这个结果

val result = translateUseCase.execute(...)

                when(result) {
                    is Resource.Success -> {
                        result.data
                    }

                    is Resource.Error -> {

                    }
                }


有几个令人困惑的事情是最好使用任何一个返回类型:
如果成功,用例确实返回一个String,所以这样会更好。

suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<String>


因为如果抛出异常,if可能返回错误,如果成功,则返回String,所以在这种情况下,Any会更好

suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<Any>


还是用星星投影更好

suspend fun execute(fromLanguage: Language, fromText: String, toLanguage: Language): Resource<*>


实现此响应接口的最佳方法是什么?

ejk8hzay

ejk8hzay1#

老实说,我真的不明白为什么你甚至考虑不使用Resource<String>。如果我们的函数返回String,但它也可能抛出异常,这并不意味着我们将其更改为返回Any。在您的特定情况下,Resource<String>意味着:“如果成功,则返回字符串值,否则返回异常”。它提供了有关潜在返回类型的完整而精确的信息。
所以答案是:使用Resource<String>

vm0i2vca

vm0i2vca2#

Resource<String>是最合理的返回类型。在这种情况下,如果成功,则类型String是数据的类型。即使您有Error<String>,它仍然包含比Error<Any>更多的信息,因为它告诉您错误是专门请求String的结果。
如果返回类型为Resource<Any>,则会删除信息而不会获得任何好处。您将无法以String的形式检索成功的结果,但如果它是错误的,则不会影响您如何处理它。因此,在错误的情况下,这样做只有缺点而没有好处。
由于Tout,因此在这种情况下,Resource<*>Resource<Any>相同。

toe95027

toe950273#

第一个月
真的在错误时返回资源吗?你有在流的早期处理错误的要求吗?
看看你的用例,答案似乎是否定的。所以我想知道是否有一个默认的失败处理程序拦截器,抛出的异常传播到,而不是手动捕捉这些错误,将是一个更好的方法?
但是,如果需要以更结构化和可预测的方式处理这些错误,请查看Arrow's typed errors,因为这似乎是您试图实现的目标(即Either<Fail, Success>

相关问题