- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将一些 Java 代码直接转换为树莓派上的 Clojure。我坚持在方法调用中实现接口(interface) - addListener。
我尝试过使用 reify、proxy 和 deftype。通过 reify,我尝试向编译器提供尽可能多的提示。
这是原来的Java code :
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 No matching method found: addListener for class com.pi4j.io.gpio.impl.GpioPinImpl clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
最佳答案
我不熟悉为树莓派编写Java,但看看javadoc我们看到以下声明:
public void addListener(GpioPinListener... listener);
public void addListener(List<? extends GpioPinListener> listeners);
两者都接受大量听众,而不仅仅是一个。在上面提供的 Java 示例中,java 编译器将单个监听器实例透明地转换为单一 vector ,并使用上面显示的第一个定义。
clojure 编译器不知道如何做到这一点,你必须帮助它。这个问题本质上可以归结为 how to call variadic java functions from clojure .
如果没有对此进行测试,我相信解决方案将使用 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)))))]))
您可能需要稍微扭转这一点,但我相信这是您面临的核心问题。
由于上面的第二个声明,另一个潜在的解决方案可能只是将其包装在一些常规列表中,例如 vector :
(.addListener myButton
[(reify GpioPinListenerDigital
(^void handleGpioPinDigitalStateChangeEvent [this ^GpioPinDigitalStateChangeEvent event]
(println (str " --> GPIO PIN STATE CHANGE: " (.getPin event) " = " (.getState event)))))])
关于java - 如何从 Clojure 中的类调用具体化的 Java 接口(interface)?调用电话无法解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53875417/
可能很明显,但给出这段代码(来自 http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify ): (defn
我有一个空页面,我在其中动态添加元素,我正在尝试使用 Materialize,但我遇到了图形问题... 我已按照“http://materializecss.com/”上的不同教程使用正确的方法添加元
我正在尝试定义关系 callto_status(Goal, Status)总是成功,根据调用Goal的结果统一Status (换句话说,我想实现 call_with_inference_limit/3
我在为我的网站设置包含自动完成 (https://materializecss.com/navbar.html) 的物化搜索栏 (https://materializecss.com/autocomp
我有一个即将到来的逻辑考试,并且一直在学习我类(class)中的一些过去的论文。我遇到了一个关于物化的问题,并将其发布在下面; 用具体化来表示变量 B 的性质 取值为 1 或 8。 在阅读了一些资源并
我有一个 Laravel 项目,其中一个页面有 5 个模态(MaterializeCSS),每个模态都有一个表单。当我提交表单并遇到任何验证错误时,模式必须重新打开。 我可以通过运行以下代码来实现这一
我是一名优秀的程序员,十分优秀!