给定简单的类:
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