首页 > 解决方案 > Kotlin 中的全局通用值

问题描述

给定简单的类:

data class Optional<T>(val value: T?)

我可以如下定义通用函数和值扩展

fun <T> T?.makeOptional() = Optional(this)  // Compiles ✅
val <T> T?.optional get() = Optional(this) // Compiles ✅

我还可以定义全局泛型函数:

fun <T> makeOptionalNull() : Optional<T> = Optional(null) // Compiles ✅

但是我不能为最后一个函数定义一个等效的全局通用值:

val <T> optionalNull : Optional<T> = Optional(null) // Compilation Error ❌
//   ^ Type parameter of a property must be used in its receiver type

不过,全局非通用值完全可以:

val stringNull : Optional<String> = Optional(null) // Compiles ✅

如何创建与上述类似的全局通用值?甚至可能吗?

标签: genericskotlin

解决方案


您的问题可以通过以下方式解决:

data class Optional<out T>(val value: T?) // <- note the 'out' modifier here

val optionalNull: Optional<Nothing> = Optional(null)

// and use it as follows:
val myOptionalVariable: Optional<String> = optionalNull // assignable thanks to 'out' modifier

推荐阅读