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
}

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

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

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

// 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 
    }
}
罗兰

您可以使用它解决泛型扩展功能上通用的接收器。从更新后的示例派生扩展功能:

fun <T : A> T.g(x: (T)->Int){
    print(x(this))
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

高阶函数参数类型的类型推断错误

来自分类Dev

Kotlin - 高阶函数和类型不匹配

来自分类Dev

传递lambda参数时,数据类中的Kotlin单元测试高阶函数失败

来自分类Dev

Kotlin高阶函数,用于将函数传递给地图

来自分类Dev

Kotlin高阶函数,用于将函数传递给地图

来自分类Dev

Haskell高阶函数。传递两个函数作为参数。

来自分类Dev

传递给高阶函数的函数中的参数从何而来?

来自分类Dev

Java将类型作为参数传递给期望子类型的函数

来自分类Dev

为什么 Kotlin 高阶函数可以有命名参数?

来自分类Dev

高阶函数:“无法使用类型'((_)-> _)'的参数列表调用'map'”

来自分类Dev

高阶函数参数

来自分类Dev

Haskell高阶函数类型

来自分类Dev

reasonml类型高阶函数

来自分类Dev

R:使用用户输入将函数和参数作为参数传递给高阶函数

来自分类Dev

R:使用用户输入将函数和参数作为参数传递给高阶函数

来自分类Dev

为什么在Kotlin中可以将高阶函数的扩展函数参数作为常规函数调用?

来自分类Dev

Kotlin高阶函数如何工作?

来自分类Dev

高阶函数,流类型注释

来自分类Dev

高阶函数的Clojure类型提示

来自分类Dev

F# 将参数传递到高阶函数或声明自己的函数

来自分类Dev

如何确保传递给高阶函数的泛型函数具有void返回类型?

来自分类Dev

使用 Kotlin 中的高阶函数,为什么 lambda 会显示在其他函数参数之外?

来自分类Dev

对类进行子类化以更改Kotlin中类型参数的方差

来自分类Dev

对类进行子类化以更改Kotlin中类型参数的方差

来自分类Dev

打字稿:如何从返回函数的输入参数推断高阶函数中的泛型类型

来自分类Dev

Kotlin:将函数范围作为参数传递

来自分类Dev

将“类型”参数传递给函数

来自分类Dev

具有不同参数子类型的Julia函数

来自分类Dev

具有不同参数子类型的Julia函数

Related 相关文章

  1. 1

    高阶函数参数类型的类型推断错误

  2. 2

    Kotlin - 高阶函数和类型不匹配

  3. 3

    传递lambda参数时,数据类中的Kotlin单元测试高阶函数失败

  4. 4

    Kotlin高阶函数,用于将函数传递给地图

  5. 5

    Kotlin高阶函数,用于将函数传递给地图

  6. 6

    Haskell高阶函数。传递两个函数作为参数。

  7. 7

    传递给高阶函数的函数中的参数从何而来?

  8. 8

    Java将类型作为参数传递给期望子类型的函数

  9. 9

    为什么 Kotlin 高阶函数可以有命名参数?

  10. 10

    高阶函数:“无法使用类型'((_)-> _)'的参数列表调用'map'”

  11. 11

    高阶函数参数

  12. 12

    Haskell高阶函数类型

  13. 13

    reasonml类型高阶函数

  14. 14

    R:使用用户输入将函数和参数作为参数传递给高阶函数

  15. 15

    R:使用用户输入将函数和参数作为参数传递给高阶函数

  16. 16

    为什么在Kotlin中可以将高阶函数的扩展函数参数作为常规函数调用?

  17. 17

    Kotlin高阶函数如何工作?

  18. 18

    高阶函数,流类型注释

  19. 19

    高阶函数的Clojure类型提示

  20. 20

    F# 将参数传递到高阶函数或声明自己的函数

  21. 21

    如何确保传递给高阶函数的泛型函数具有void返回类型?

  22. 22

    使用 Kotlin 中的高阶函数,为什么 lambda 会显示在其他函数参数之外?

  23. 23

    对类进行子类化以更改Kotlin中类型参数的方差

  24. 24

    对类进行子类化以更改Kotlin中类型参数的方差

  25. 25

    打字稿:如何从返回函数的输入参数推断高阶函数中的泛型类型

  26. 26

    Kotlin:将函数范围作为参数传递

  27. 27

    将“类型”参数传递给函数

  28. 28

    具有不同参数子类型的Julia函数

  29. 29

    具有不同参数子类型的Julia函数

热门标签

归档