我想知道是否有可能强制kotlin推断给定类型推断的非null值。考虑以下示例:
abstract class Wrapper<T>
class StringWrapper : Wrapper<String>()
fun <O, P> wrap(property: KProperty1<O, P>, wrapper: Wrapper<P>) {
}
当我在不可为空的属性上调用
wrap
时,一切正常:data class NonNullableExample(val value: String)
wrap(NonNullableExample::value, StringWrapper())
但是,当我在可为空的属性上调用
wrap
时,会出现编译器错误,因为P
的推论是可为空的,而StringWrapper
却不是:data class NullableExample(val value: String?)
wrap(NullableExample::value, StringWrapper())
因此,基本上我想要的是,不管
P
是可为空还是不可为空,P
的Wrapper<P>
应该始终是P
的不可为空的形式。这可能吗? 最佳答案
如前所述,这不太合理:P
只有一个,而Wrapper<P>
和KProperty1<O, P>
中没有单独的一个。因此,如果您希望它们不同,则不能同时使用P
。
但是KProperty1
在结果类型中是协变的,因此KProperty1<O, P>
也是KProperty1<O, P?>
。因此,如果将签名更改为
fun <O, P : Any> wrap(property: KProperty1<O, P?>, wrapper: Wrapper<P>): Unit
它将接受可为空和不可为空的属性:
wrap(NonNullableExample::value, StringWrapper())
wrap(NullableExample::value, StringWrapper())
// both compile
关于kotlin - Kotlin-获取可为空的泛型类型推断的不可为空的推断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50730367/