请分享您的想法,参与 2024 年 Clojure 状态调查!

欢迎!请参阅 关于 页面获取更多关于本网站的信息。

0
Clojure

我正在尝试使用 gen-interface 来复制一个 Java 接口,该接口在 Java 类中实现时定义了它们的重写为 throws Exception。但我不清楚在 Clojure 中如何在签名中指定这一点?

示例

public class Someclass implements MyInterface {
  public void perform(CommandLine line) throws Exception {
     ...
  }
}

-

(gen-interface
 :name some.place.MyInterface
 :methods [[perform [org.apache.commons.cli.CommandLine] void]])

这在 javac 中失败,错误信息为:被覆盖的方法没有抛出异常

是否存在任何方法,可以使用 gen-interface 在 Clojure 中创建一个声明 throws 子句的接口?

2 个回答

+1

被选中
 
最佳答案

这不受支持,并且不太可能添加。

创建如此自定义接口的最佳选项是在 Java 中定义它们。

0
by

我认为“gen-class”或“gen-interface”都不支持受检查的异常。虽然我可能有误。你为什么希望有一个通用的“throws Exception”声明?

我个人(因为我认为受检查的异常是一个糟糕的想法)的方法是,每当我有可能抛出异常的代码时,我将它包裹在一个try-catch中,将受检查的异常包装在一个RuntimeException中并抛出。

by
这主要是为了向后兼容。有很多现有的Java代码使用该接口并实现它,其中声明抛出异常而实现抛出受检查的异常。要更改所有这些代码将非常辛苦。

我重新编写Java接口的原因是,我想要在Clojure中实现这个接口,但由于Java代码已经使用了Clojure,所以我们有一个循环依赖,Java需要先构建Clojure,Clojure需要先构建Java。我可以将其提取到一个第3个库中,但这也很烦人,所以我希望我可以在Clojure中创建接口。
by
你可以发布一些你试图实现的示例代码吗?Clojure禁止使用名称空间中的循环依赖,但在Java接口/类领域中实际上通常可以
by
这涉及到构建层面。我有一个混合了Clojure和Java的项目。Java通过某些gen-class调用Clojure代码,因此我必须首先构建Clojure,以便Java编译时能够找到要链接的gen-classes。但是,有一个地方我想要一个实现Java接口的Clojure gen-class。在这个时候,当Clojure编译gen-class时,它失败了,因为它找不到接口类文件,因为Java还没有被构建。

所以我尝试将接口移动到Clojure领域,但定义的方法会抛出异常,所以似乎这是不可能的。
by
您可以使用leiningen或boot更精细地控制构建顺序。首先编译生成gen-class的具体Clojure代码,然后Java,然后其余的Clojure。
...