我想知道是否有可能强制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是可为空还是不可为空,PWrapper<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/

10-10 07:10