我一直在尝试遵循这个教程。这是我的回调:
(def cb (proxy [java.lang.Object GLFWKeyCallbackI] []
(invoke [window keycode _ action _]
(when (and (= keycode GLFW/GLFW_KEY_ESCAPE)
(= action GLFW/GLFW_PRESS))
(GLFW/glfwSetWindowShouldClose window true)))))
在这里我注册它:
(GLFW/glfwSetKeyCallback window cb)
这给了我这个错误:
Execution error (UnsupportedOperationException) at lwjgl_intro.core.proxy$java.lang.Object$GLFWKeyCallbackI$84f3fd50/address (REPL:-1).
address
为什么我会收到这个错误?
编辑:这是上面链接的教程中的代码片段:
glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop
});
更新:下面划掉的文字是无关紧要的,因为我没有注意到的默认实现
address
。在错误中,您可以看到实际调用的方法是address
,而您的代理没有实现它。GLFWKeyCallbackI
延伸CallbackI
——这就是该方法的来源。为了使类型能够正确实现所有接口,它必须实现整个接口扩展链上的所有方法。此外,除了address
和 之外invoke
,还有其他方法,因此您proxy
必须进行大量扩展才能正确使用它。此外,没有必要
java.lang.Object
在那里指定 - 所有类型都已默认隐式继承它。你可以使用
reify
: