Kotlin中的方差/协方差泛型

问题描述 投票:1回答:1

有一个密封类的结果,它用两种类型进行参数化-成功结果(T)和错误类型(R)。

它由两个类继承:

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

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

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

  • 可以将此函数的结果分配给以下类型的变量:
    Result<Number, String>
    Result<Any, String>
  • 可以将此函数的结果NOT分配给以下类型的变量:
    Result<Int, CharSequence>
    Result<Int, Any>

即类Result必须在T参数上协变而在R参数上不变。

generics kotlin covariance invariance
1个回答
1
投票

您可以在结果类的声明中使用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)
    }
}
    
© www.soinside.com 2019 - 2024. All rights reserved.