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接口的命名空间中添加默认方法,并在其中实现默认方法中所做的操作。

1 答案

0

选中
 
最佳答案

该重现实例在我这里无法运行(从链接的分支),得到“无法加载命名空间: lint”。

我坚信实际的问题与标题相反——默认方法的整个目的是实现类无需实现接口的默认方法。然而,实际上发生的情况是,genclass 确实 生成了一个默认方法 otherthing 的方法实现,该方法调用 Clojure 变量 -otherthing(这是 genclass 的工作方式,但保留了 Clojure 的动态性)。

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

https://clojure.atlassian.net/browse/CLJ-2794 登记。

这样一来就明白了,我曾经以为最后 Clojure 编译器需要实现默认方法并做同样的操作,但实际上并非如此,它实际上根本不需要实现该方法,对吧?

感谢您的帮助!
...