2024年Clojure调查中分享您的想法!

欢迎!请参阅关于页面以获取更多关于其工作原理的信息。

+5
编译器
重标记

当使用gen-class时,生成的.class文件中没有java接口的默认方法。

我创建了这个重现,您可以在尝试从由gen-class生成的类中调用方法时确认会抛出异常

  • clj -T:build jar用于在target/classes下生成类
  • java -cp clj -Spath client/main/Main.java

会抛出异常

Exception in thread "main" java.lang.UnsupportedOperationException: otherthing (clojure-sample.foo/-otherthing not defined?)
    at clojure_sample.Foo.otherthing(Unknown Source)
    at client.main.Main.main(Main.java:9)

不是非常理想的解决方案是在实现java接口的命名空间中添加默认方法,并在默认方法内部执行在java接口中执行的操作。

1 答案

0

已选择
 
最佳答案

这个复现实例(从我提供的分支中)运行不成功,我收到了“命名空间无法加载:lint”的错误。

我认为实际问题是标题的反面 - 默认方法的主要目的是实现类无需实现接口的默认方法。但实际上发生的情况是,genclass 确实是 生成默认方法 otherthing 的方法实现,该方法会调用到 Clojure 变量 -otherthing(这是 genclass 的工作方式,同时保留了 Clojure 的动态特性)。

您可以从错误信息中推断这一点:“UnsupportedOperationException: otherthing (clojure-sample.foo/-otherthing 未定义?)”。在“otherthing”中,它试图调用 “-otherthing”。

记录在 https://clojure.atlassian.net/browse/CLJ-2794

by
原来如此,我本以为最后 Clojure 编译器需要实现默认方法并执行相同的操作,但这确实不太合理,它实际上根本无需实现该方法,不是吗?

感谢您的帮助!
...