代码之家  ›  专栏  ›  技术社区  ›  elect

如何在需要接口的地方直接传递lambda

  •  0
  • elect  · 技术社区  · 8 年前

    Lwjgl中有一个函数,例如:

    public static void glDebugMessageCallback(
    @Nullable @NativeType("GLDEBUGPROC") GLDebugMessageCallbackI callback, 
    @NativeType("void const *") long userParam) {
        nglDebugMessageCallback(memAddressSafe(callback), userParam);
    }
    

    在科特林,我可以用以下方式直接调用它:

    glDebugMessageCallback({ _, _, _, _, _, message, _ -> Unit }, NULL)
    

    现在,我想覆盖这个调用,忽略最后一个参数。

    但如果我打字:

    fun glDebugMessageCallback(callback: GLDebugMessageCallbackI) {
    
    }
    

    然后同样的电话没有 NULL :

    glDebugMessageCallback({ _, _, _, _, _, message, _ -> Unit })
    

    将得到类型不匹配:

    Required: GLDebugMessageCallbackI
    
    Found: (???, ???, ???, ???, ???, ???, ???) → Unit
    

    为什么以及如何解决这个问题?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Marko Topolnik    8 年前

    科特林支架 SAM conversion 仅用于与Java的互操作。因此,要么在Java类中声明便利方法,要么为Kotlin函数声明函数类型,委托给Java调用。

        2
  •  1
  •   hluhovskyi    8 年前

    为了给Marko Topolnik的答案添加更多信息,Kotlin接口的SAM转换有可能在1.3版中作为一项实验性功能得到支持。可能的语法如下所示:

    sam interface Callback {
        fun justSingleMethod(first: Int, second: Int): Boolean
    }
    

    使用方法与Java接口相同:

    fun doSomethingWithCallback(callback: Callback) {
        ...
    }
    
    doSomethingWithCallback { first, second -> true }
    

    P.S.信息摘自Stanislav Erokhin(俄语)的以下演示 https://youtu.be/gwk4rdgr36E?t=56m54s