我在 Kotlin 中遇到了函数参数的问题。我将借助一些代码来解释这个问题。
我创建了一个类层次结构。当我将子类型传递给需要父类型的函数时,没有问题。
open class A (val i: Int)
class B (val j: Int) : A(j)
fun f(x: A){
print(x)
}
fun test_f(){
f(A(1))
f(B(1)) //no problem
}
我尝试用函数参数来模仿这一点。
fun g(x: (A)->Int){
print(x)
}
fun test_g(){
val l1 = { a: A -> a.hashCode()}
g(l1)
val l2 = { b: B -> b.hashCode()}
g(l2) //Error: Type mismatch. Required: (A)->Int, Found: (B)->Int
}
好像是函数类型(B) -> Int
不是 的子类型(A) -> Int
.
解决这个问题的最佳方法是什么?
我原来的问题是定义一个高阶函数A.h
需要一个函数z: (A) -> X
作为参数。我想打电话h
在类型的对象上B
并传递一个函数z: (B) -> X
.
Update:我尝试了带有上限的泛型,但我的问题没有解决。请找到下面的代码:
// Using generics doesn't allow me to pass A.
open class A (val i: Int) {
fun <M: A> g(x: (M)->Int){
print(x(this)) // Error: Type mismatch. Expected: M, Found: A
}
}
您可以使用以下方法解决它generics https://kotlinlang.org/docs/reference/generics.html and an 扩展功能 https://kotlinlang.org/docs/reference/extensions.html在通用接收器上。从更新的示例中派生扩展函数:
fun <T : A> T.g(x: (T)->Int){
print(x(this))
}
这样可以确保接收者和给定函数的第一个参数类型相同,可以是A
或其子类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)