kotlin - Kotlin - 获取可空泛型类型推断的不可空推断
问题描述
我想知道是否可以强制 kotlin 推断给定类型推断的不可为空。考虑以下示例:
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
类型推断失败:无法推断类型参数
fun <O, P> wrap(property: KProperty1<O, P>, wrapper: Wrapper<P>): Unit
以下替换均无
(KProperty1<NullableExample, String>, Wrapper<String>)
(KProperty1<NullableExample, String?>, Wrapper<String?>)
可以应用于
(KProperty1<NullableExample, String?>, StringWrapper)
所以基本上我想要的是,无论P
是可空的还是不可空的,P
ofWrapper<P>
应该始终是不可空的P
. 这可能吗?
解决方案
所以基本上我想要的是,无论
P
是可空的还是不可空的,P
ofWrapper<P>
应该始终是不可空的P
.
如前所述,这不太有意义: and 中只有一个,P
而不是单独的一个。因此,如果您希望它们有所不同,则不能同时使用它们。Wrapper<P>
KProperty1<O, P>
P
但是KProperty1
在结果类型中是协变的,所以 aKProperty1<O, P>
也是 a 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
推荐阅读
- vue.js - BootstrapVue 和 VueJS 中的布尔显示值
- javascript - 如何在 javascript 页面上自动播放声音?
- reactjs - React-Table 的导入问题
- react-native - 如何在 React Native 上启动项目
- dataset - 用于 Image GT 数据集的 Pytorch 数据加载器
- kotlin - Kodein 内部的 NullPointerException
- swift - RxTest - 如何比较事件
因为 Void 不是 Equatable - javascript - 路由器视图未列出组件
- android - 类 ContentResolver 或其超类中没有虚拟方法 loadThumbnail()
- c - C4496 和 C6387 用于使用 strcpy 和 strcat