【发布时间】:2018-06-07 21:44:52
【问题描述】:
我想知道是否可以强制 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())
类型推断失败:无法推断类型参数
Pin
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 是可空的还是不可空的,Wrapper<P> 的P 应该始终是P 的不可空形式。这可能吗?
【问题讨论】:
-
你能从
value定义一个派生属性,但不能为空,并在调用wrap时执行NullableExample::NonNullableValue吗?当然你需要处理value是null时会发生什么,但无论如何你都需要在某个地方处理它,对吧?
标签: kotlin