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-防止不可为null的泛型函数返回null_Kotlin - Fatal编程技术网

Kotlin-防止不可为null的泛型函数返回null

Kotlin-防止不可为null的泛型函数返回null,kotlin,Kotlin,我有以下方法 fun <P> configure(property: KProperty1<R, P>, transform: (source: S) -> P) { ... } 当属性不可为null时,是否可以重构该方法以防止转换函数返回可为null的结果?而不是 fun <P> configure(...) fun配置(…) 试试这个 fun <P : Any> configure(...) fun配置(…) 因为从 默

我有以下方法

fun <P> configure(property: KProperty1<R, P>, transform: (source: S) -> P) {
    ...
}
当属性不可为null时,是否可以重构该方法以防止转换函数返回可为null的结果?

而不是

fun <P> configure(...)
fun

配置(…)

试试这个

fun <P : Any> configure(...)
fun配置(…)
因为从

默认上限(如果未指定)为Any


这个问题实际上更一般:

configure(Foo::bar, { Object() })
这也行。由于
KProperty1
位于其第二个类型参数中,因此
KProperty1
(例如)也是
KProperty1
、a
KProperty1
等。这也适用于函数类型
(源代码:S)->P
。因此,无论传递什么(单参数)
transform
,编译器都会找到一个
P
,这样类型就适合了:属性和函数返回类型的最小上界

我能想到的一个相当丑陋的解决方法是创建非协变包装类型:

class NonCov<A>(val value: A)

fun <P> configure(property: NonCov<KProperty1<R, P>>, transform: NonCov<(source: S) -> P)>) {
    ... // use property.value and transform.value
}
class NonCov(val值:A)
fun

配置(属性:NonCov,转换:NonCov P)>){ …//使用property.value和transform.value }

然后

A类(val x:String)
fun

配置(属性:NonCov,转换:NonCov P>){ 趣味主线(args:Array){ configure(NonCov(A::x),NonCov{“})//编译 configure(NonCov(A::x),NonCov{null})//不编译 }


如果
::bar
可为空,则不起作用。即使不能解决实际问题,也不能解决实际问题,因为它不限于可空性:)
class NonCov<A>(val value: A)

fun <P> configure(property: NonCov<KProperty1<R, P>>, transform: NonCov<(source: S) -> P)>) {
    ... // use property.value and transform.value
}
class A(val x: String)

fun <P> configure(property: NonCov<kotlin.reflect.KProperty1<A, P>>, transform: NonCov<(source: A) -> P>) {}

fun main(args: Array<String>) {
    configure(NonCov(A::x), NonCov { "" }) // compiles
    configure(NonCov(A::x), NonCov { null }) // doesn't compile
}