Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin-获取可空泛型类型推断的不可空推断_Kotlin - Fatal编程技术网

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的推

我想知道是否有可能强迫kotlin推断出给定类型推断的不可为空。考虑下面的例子:

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