【问题标题】:Variance/Covariance generics in KotlinKotlin 中的方差/协方差泛型
【发布时间】:2020-06-06 05:37:24
【问题描述】:

有一个密封类Result,它被参数化为两种类型-成功结果(T)和错误类型(R)。

它被两个类继承:

一个。成功 - 数据类,在构造函数中接受对象 T

b.错误 - 数据类,在构造函数中接受对象 R

我需要创建一个函数,它返回 Result 对象。该函数必须以某种方式创建:

  • 这个函数的结果可以赋值给以下类型的变量:
    Result<Number, String>
    Result<Any, String>
  • 这个函数的结果可以赋给以下类型的变量:
    Result<Int, CharSequence>
    Result<Int, Any>

即类Result必须在T参数上协变,在R参数上保持不变。

【问题讨论】:

    标签: generics kotlin covariance invariance


    【解决方案1】:

    您可以在 Result 类的声明中使用 Kotlin 提供的declaration-site variance

    • T -> 默认情况下 T 是不变的
    • out T -> 使 T 协变
    • in T -> 使 T 成为协变的

    例子:

    sealed class Result<out T, R>(val left: T? = null, val right: R? = null) {
        class Success<T, R>(data: T) : Result<T, R>(left = data)
        class Error<T, R>(data: R) : Result<T, R>(right = data)
    }
    
    fun main() {
        val res1 = Result.Success<String, Int>("Test")
        val res2: Result<Any, Int> = res1     // compiles successfully, T is covariant
        val res3: Result<String, Any> = res1  // doesn't compile, R is invariant (Type Mismatch)
    }
    

    函数可以返回结果为:

    fun returnResult(): Result<String, Int> {
        val random = Random.nextBoolean() // random, for demonstration
    
        retrun if(random) {
            Result.Success("Success Example")
        } else {
            Result.Error(404)
        }
    }
    

    【讨论】:

    • 单独的函数怎么样?
    • @matua 函数?
    • "我需要创建一个函数,它返回 Result 对象。" - 不是简单的分配。我对语法有困难,如果函数必须始终参数化。
    • @matua 函数返回结果对象?成功还是错误?你想如何设置另一个泛型?
    • @matua,和上面一样吗?
    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 2020-11-20
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多