Kotlin-获取可空泛型类型推断的不可空推断
我想知道是否有可能强迫kotlin推断出给定类型推断的不可为空。考虑下面的例子:Kotlin-获取可空泛型类型推断的不可空推断,kotlin,Kotlin,我想知道是否有可能强迫kotlin推断出给定类型推断的不可为空。考虑下面的例子: abstract class Wrapper<T> class StringWrapper : Wrapper<String>() fun <O, P> wrap(property: KProperty1<O, P>, wrapper: Wrapper<P>) { } 但是,当我对一个可为null的属性调用wrap时,我得到一个编译器错误,因为p的推
abstract class Wrapper<T>
class StringWrapper : Wrapper<String>()
fun <O, P> wrap(property: KProperty1<O, P>, wrapper: Wrapper<P>) {
}
但是,当我对一个可为null的属性调用wrap
时,我得到一个编译器错误,因为p
的推断是可为null的,而StringWrapper
不是:
data class NullableExample(val value: String?)
wrap(NullableExample::value, StringWrapper())
类型推断失败:无法在中推断类型参数p
fun wrap(属性:KProperty1,wrapper:wrapper):单位
以下替代品均不适用
(KProperty1,包装器)
(KProperty1,包装器)
适用于
(KProperty1,StringWrapper)
所以基本上我想要的是,不管p
是可空的还是不可空的,Wrapper
的p
应该始终是p
的不可空形式。这可能吗
所以基本上我想要的是,不管p
是可空的还是不可空的,Wrapper
的p
应该始终是p
的不可空形式
如前所述,这并不十分合理:只有一个p
,而在Wrapper
和KProperty1
中没有单独的一个。所以,如果你想让它们不同,你不能同时使用P
但是KProperty1
在结果类型中是协变的,因此KProperty1
也是KProperty1
。所以如果你把签名改成
fun <O, P : Any> wrap(property: KProperty1<O, P?>, wrapper: Wrapper<P>): Unit
您能否从
value
定义派生属性,但该属性不可为null,并且在调用wrap
时是否执行nullablexample::NonNullableValue
?当然,您需要处理value
为null
时发生的情况,但无论如何您都需要在某个地方处理,对吗?
fun <O, P : Any> wrap(property: KProperty1<O, P?>, wrapper: Wrapper<P>): Unit
wrap(NonNullableExample::value, StringWrapper())
wrap(NullableExample::value, StringWrapper())
// both compile