Kotlin高阶函数参数:传递子类型

Neo*_*Neo 5 kotlin

我在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
}
Run Code Online (Sandbox Code Playgroud)

我试图用函数参数来模仿它。

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
}
Run Code Online (Sandbox Code Playgroud)

看来函数类型(B) -> Int不是的子类型(A) -> Int解决此问题的最佳方法是什么?

我最初的问题是定义一个A.h以函数 z: (A) -> X为参数的高阶函数。我想调用h一个类型的对象B并传递一个函数z: (B) -> X

更新: 我尝试了泛型上限,但我的问题没有解决。请在下面找到代码:

// 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 
    }
}
Run Code Online (Sandbox Code Playgroud)

Rol*_*and 3

您可以使用泛型和泛型接收器上的扩展函数来解决它。从更新的示例中派生扩展函数:

fun <T : A> T.g(x: (T)->Int){
    print(x(this))
}
Run Code Online (Sandbox Code Playgroud)

这样可以确保接收者和给定函数的第一个参数类型相同,即A它的类型或子类型。