java - 如何从 Clojure 中的类调用具体化的 Java 接口?通话无法解决
问题描述
我正在尝试将一些 Java 代码直接翻译成树莓派上的 Clojure。我坚持在方法调用中实现接口 - addListener。
我尝试过使用 reify、proxy 和 deftype。通过 reify,我尝试为编译器提供尽可能多的提示。
这是原始的Java 代码:
myButton.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
System.out.println(" --> GPIO PIN STATE CHANGE: " + event.getPin() + " = " + event.getState());
}
});
这是我翻译的 Clojure 代码:
(.addListener myButton
(reify GpioPinListenerDigital
(^void handleGpioPinDigitalStateChangeEvent [this ^GpioPinDigitalStateChangeEvent event]
(println (str " --> GPIO PIN STATE CHANGE: " (.getPin event) " = " (.getState event))))))
我总是以同样的错误告终:
IllegalArgumentException 未找到匹配方法:com.pi4j.io.gpio.impl.GpioPinImpl clojure.lang.Reflector.invokeMatchingMethod 类的 addListener (Reflector.java:79)
解决方案
我不熟悉为 raspberry pi 编写 Java,但查看javadoc我们看到以下声明:
public void addListener(GpioPinListener... listener);
public void addListener(List<? extends GpioPinListener> listeners);
两者都接受众多听众,而不仅仅是一个。在您上面提供的 Java 示例中,java 编译器将单个侦听器实例透明地转换为单例向量,并使用上面显示的第一个定义。
clojure 编译器不知道该怎么做,你必须帮助它。这个问题本质上归结为如何从 clojure 调用可变参数 java 函数。
如果不对此进行测试,我相信解决方案将使用 clojure 的into-array
功能,因此类似于以下内容:
(.addListener myButton
(into-array GpioPinListenerDigital
[(reify GpioPinListenerDigital
(^void handleGpioPinDigitalStateChangeEvent [this ^GpioPinDigitalStateChangeEvent event]
(println (str " --> GPIO PIN STATE CHANGE: " (.getPin event) " = " (.getState event)))))]))
你可能不得不稍微扭曲一下,但我相信这是你面临的核心问题。
编辑
由于上面的第二个声明,另一个潜在的解决方案可能只是将其包装在一些常规列表中,例如向量:
(.addListener myButton
[(reify GpioPinListenerDigital
(^void handleGpioPinDigitalStateChangeEvent [this ^GpioPinDigitalStateChangeEvent event]
(println (str " --> GPIO PIN STATE CHANGE: " (.getPin event) " = " (.getState event)))))])
推荐阅读
- c++ - 如果为空,则从 QListWidget 中删除可编辑项
- c# - AssetBundle.LoadAsset 总是返回 NULL
- docker - cpu限制后docker容器失败
- performance - 是否可以仅在 WebGL 中绘制移动网格?
- swift - 将 UTF-8 (Bytes) Emoji Code 转换为 Emoji 图标作为文本
- c++ - QQuickView 新删除类型不匹配
- ios - 何时使用容器视图控制器?与ios中的普通视图相比,它在内存管理方面有什么优势吗
- rundeck - 如何在 Rundeck Web UI 上终止作业时优雅地停止作业执行?
- javascript - 使用 util.inspect 检查深度对象相等性的优缺点
- .net - 获取每个部门的总数