我想定义一个以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.