给定简单的类:

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 ✅

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

最佳答案

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

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

09-10 05:54
查看更多