如何对通用Kotlin函数的参数和函数参数的返回值施加通用约束?



我想定义一个以lambda为参数的Kotlin泛型函数,但是我想限制lambda参数和返回类型的允许类型。我如何在Kotlin中做到这一点?

在下面的例子中,我期望约束:where T: Base, V: (T) -> Unit意味着V只能是其第一个参数实现Base的函数。

但是,我看到编译器忽略了约束的T: Base部分,并将接受任何(Any) -> Unit

interface Base
fun <T, V> exampleGenericFunction(func: V) where T: Base, V: (T) -> Unit {
println("func is $func")
}
class ImplementsBase : Base
class DoesNotImplementBase
fun main() {
val f1: (ImplementsBase) -> Unit = { }
exampleGenericFunction(f1)

val f2: (DoesNotImplementBase) -> Unit = { }
exampleGenericFunction(f2) // expected this to be a compilation error
}

此意外行为是由Kotlin>=1.4编译器中的错误引起的。这个bug可以在这里追踪:https://youtrack.jetbrains.com/issue/KT-48935.

相关内容

  • 没有找到相关文章

最新更新