gpt4 book ai didi

clojure - 在 Clojure 中扩展(而不是实现)Java 接口(interface)

转载 作者:行者123 更新时间:2023-12-02 12:45:32 25 4
gpt4 key购买 nike

我最近对 ​​Clojure 进行了很多研究,我一直想知道它是否适合我下一个项目的范围。不幸的是,它涉及编写不可移植的代码,并且我需要访问 Win32 API。

我偶然发现了 Java Native Access用于轻松将具有 C 接口(interface)的 native 库映射到 Java 的库。它甚至为 Kernel32.dll 提供了一个(空)包装器。作为教程中的示例!

但是,我对于将示例从 Java 转换为 Clojure 感到有点困惑。我知道我可以 implement interfaces and implement classes ,但是我如何简单地扩展接口(interface)

<小时/>

感谢 Joost 发布的链接,这里是一个最小的工作示例:

(import (com.sun.jna Library Native Platform Pointer))
(import (com.sun.jna.win32 StdCallLibrary))

(def K32
(gen-interface
:name Kernel32
:extends [com.sun.jna.win32.StdCallLibrary]
:methods [[GetCurrentProcess [] com.sun.jna.Pointer]]))

(defn load-native-library [name interface]
(cast interface (com.sun.jna.Native/loadLibrary name interface)))

(def k32 (load-native-library "kernel32" K32))

(println (.GetCurrentProcess k32))

输出#<Pointer native@0xffffffff> ,正如所料!

最佳答案

您只能用另一个接口(interface)扩展一个接口(interface)。我不明白为什么在访问现有 API 时需要该功能 - 即使在 Java 中也是如此。只需实现它并完成即可。

编辑:根据我的经验,通常用纯 Java 编写接口(interface)会更清晰;在 clojure 中定义新接口(interface)的通常原因是当您想向某些 clojure 代码添加 Java 友好的接口(interface)时。

再次编辑:如果您发现 definterface 对于这种情况更有吸引力,则可以使用 definterface。 This blog post有一些使用它来访问 JNA 的示例。

关于clojure - 在 Clojure 中扩展(而不是实现)Java 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5479694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com