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
、aKProperty1
等。这也适用于函数类型(源代码: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
}