我在使用 Kotlin 泛型和 lambda 时遇到问题。 基本上我希望我的接口在泛型类型上有一个 lambda 函数。 这是一些示例代码,显示了我想要做什么。
interface A<T : B, U : C> {
fun where(rdm: (T) -> U): A<T, U>
}
interface B {
fun debugB(): C
}
interface C
class D : B {
override fun debugB(): F {
return F()
}
fun toto() {
}
}
class F : C
class test : A<D, F> {
override fun where(rdm: (D) -> F): test {
return this
}
}
class main() {
init {
val test: A<*, *> = test()
test.where { q -> q.debugB() }
}
}
问题是,当我尝试执行以下操作时收到错误消息:
test.where { q -> q.debugB() }
:Type mismatch. Required: Nothing found: C
。
我觉得这真的很奇怪,因为它能够将 q
的类型解析为 B
但它可以找到正确的返回类型。
(我尝试过
in
out
,但都不起作用。)
不确定为什么要在
val test
对象中显式设置星号。通过这样做,您可以防止 test
对象访问 interface B
。
允许编译器通过在调用构造函数时简单地删除类型来推断类型。
val test = Test()
test.where { q -> q.debugB() }