我试图在Clojure中编写JavaFX应用程序。作为一个简单的测试,我想尝试启动一个Hello World。为了扩展Application
,我决定尝试使用proxy
代替:gen-class
。我希望能够创建一个创建Application
的简单函数,而不是每次都要求我编写样板文件。
我想出的一个简单例子是:
(let [^Application app
(proxy [Application] []
(start [self stage] (println "Hello World")))]
(Application/launch ^Class (.getClass app)
(into-array String [])))
问题是,这会导致UnsupportedOperationException
:
UnsupportedOperationException start chat.graphics_tests.javafx_wrapper.proxy $ javafx.application.Application $ ff19274a.start(: - 1)
似乎无法找到我实施的start
方法。我的第一个想法是start
的论据是错误的。他们似乎是正确的。它收到的第一个参数是" this
",然后是主要阶段。我尝试了不同数量的参数,但我仍然得到同样的错误。根据文件:
如果没有为接口方法提供方法fn,则 如果是,则抛出UnsupportedOperationException 调用。
这进一步引起了我的怀疑。
错误相当模糊。有谁看到问题是什么?
答案 0 :(得分:0)
在Clojure中编写mod_rewrite documentation类定义时,您不需要方法签名中的显式self
参数。当前实例将隐式绑定到this
,您可以在方法中使用它。
因此,您的代理呼叫应如下所示:
(proxy [Application] []
(start [stage] (println "Hello World")))
答案 1 :(得分:0)
This appears to be because Application/launch
requires a named class, which proxy
doesn't create.(请参阅答案底部的评论。我在这里信任@Sam。)
我最终塌方并使用:gen-class
,并在一些小小的事情后得到了它。