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

欢迎!请查看关于页面了解有关这个网站的一些更多信息。

+5
编译器
重新标记

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

我创建了这个示例,您可以在调用由gen-class生成的类的方法时确认会抛出异常

  • clj -T:build jar在target/classes生成类文件
  • java -cpclient/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”的提示。

我认为真正的問題是标题的反面 - 默认方法的整个意义在于实现类不需要实现接口的默认方法。但实际上,生成的类实际上是生成了默认方法otherthing的实现,该方法会调用 Clojure 变量-otherthing(这是 genclass 的工作方式,同时保留了Clojure 的动态特性)。

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

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

by
明白了,我原以为 clojure 编译器最终需要实现默认方法,并做同样的事情,但实际上并不需要对方法进行任何实现,对吗?

感谢帮助!
...