gpt4 book ai didi

kotlin - Kotlin-获取可为空的泛型类型推断的不可为空的推断

转载 作者:行者123 更新时间:2023-12-02 12:48:15 25 4
gpt4 key购买 nike

我想知道是否有可能强制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())

Type inference failed: Cannot infer type parameter P in

fun <O, P> wrap(property: KProperty1<O, P>, wrapper: Wrapper<P>): Unit

None of the following substitutions

(KProperty1<NullableExample, String>, Wrapper<String>)

(KProperty1<NullableExample, String?>, Wrapper<String?>)

can be applied to

(KProperty1<NullableExample, String?>, StringWrapper)



因此,基本上我想要的是,不管 P是可为空还是不可为空, PWrapper<P>应该始终是 P的不可为空的形式。这可能吗?

最佳答案

So basically what I want is, regardless of P being nullable or non-nullable, P of Wrapper<P> should always be the non-nullable form of 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com