Variance/Covariance Kotlin 中的泛型
Variance/Covariance generics in Kotlin
有一个密封的-class结果,它被参数化为两种类型——成功结果(T)和错误类型(R)。
被两个class继承:
一个。成功 - 数据 class,在构造函数中接受对象 T
b。错误 - 数据 class,在构造函数中接受对象 R
我需要创建一个函数,returns 结果对象。该函数必须以以下方式创建:
- 这个函数的结果可以赋值给以下类型的变量:
Result<Number, String>
Result<Any, String>
- 此函数的结果不能分配给以下类型的变量:
Result<Int, CharSequence>
Result<Int, Any>
即class结果必须在 T 参数上是协变的,在 R 参数上是不变的。
您可以在结果声明中使用 Kotlin 提供的 declaration-site variance class。
T
-> 默认 T 不变
out T
-> 使 T 协变
in T
-> 使 T contavariant
示例:
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)
}
函数可以 return 结果为:
fun returnResult(): Result<String, Int> {
val random = Random.nextBoolean() // random, for demonstration
retrun if(random) {
Result.Success("Success Example")
} else {
Result.Error(404)
}
}
有一个密封的-class结果,它被参数化为两种类型——成功结果(T)和错误类型(R)。
被两个class继承:
一个。成功 - 数据 class,在构造函数中接受对象 T
b。错误 - 数据 class,在构造函数中接受对象 R
我需要创建一个函数,returns 结果对象。该函数必须以以下方式创建:
- 这个函数的结果可以赋值给以下类型的变量:
Result<Number, String>
Result<Any, String>
- 此函数的结果不能分配给以下类型的变量:
Result<Int, CharSequence>
Result<Int, Any>
即class结果必须在 T 参数上是协变的,在 R 参数上是不变的。
您可以在结果声明中使用 Kotlin 提供的 declaration-site variance class。
T
-> 默认 T 不变out T
-> 使 T 协变in T
-> 使 T contavariant
示例:
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)
}
函数可以 return 结果为:
fun returnResult(): Result<String, Int> {
val random = Random.nextBoolean() // random, for demonstration
retrun if(random) {
Result.Success("Success Example")
} else {
Result.Error(404)
}
}