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 时失败:重写方法没有抛出 Exception

是否有可能在 Clojure 中使用 gen-interface 创建一个声明了 throws 子句的接口?

2 答案

+1
 
最佳答案

这不被支持,也不太可能被添加。

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

0

我认为gen-class和gen-interface都不支持检查异常。不过,我可能错了。你为什么想要一个通用的“throws Exception”声明呢?

就我个人而言(因为我认为checked exceptions是一个糟糕的主意),每当有代码可能会抛出一个异常时,我就会将其包裹在一个try catch块中,将检查异常包装在RuntimeException中,然后抛出。

这主要为了向后兼容。有很多现有的Java代码使用了这个接口,并实现了抛出异常的声明,以及它们的实现都抛出checked异常。要全部修改这些代码将会是一项巨大的工作。

我之所以在Java中重新编写接口,是因为我想要在Clojure中实现这个接口,但Java代码已经使用了Clojure,因此存在一个循环依赖,Java需要先构建Clojure,而Clojure则需要先构建Java。我本可以将它提取出来成为一个第三方的库,但这也很麻烦,所以我希望能够在Clojure中直接创建这个接口。
你能贴出更多一些你想要实现的示例代码吗?Clojure禁止namespace中的循环依赖,但在Java接口/类的领域中实际上通常是允许的。
这是在构建层面的。我有一个混搭的Clojure/Java项目。Java通过一些gen-class调用Clojure代码,因此我必须先构建Clojure,以便Java在编译时能够找到要链接的gen-classes。但是,在某个地方,我希望有一个Clojure gen-class实现Java接口。在这个点,当Clojure编译gen-class时,它会失败,因为找不到接口类文件,因为Java尚未构建。

所以我试图将接口移到Clojure环境中,但它定义了抛出异常的方法,因此这似乎是不可能的。
您可以使用leiningen或boot更细致地控制构建顺序。首先编译生成gen-class的特定clojure代码,然后是java代码,最后是剩余的clojure代码。
...