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
by
 
最佳答案

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

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

0
by

我认为gen-class或gen-interface都不支持受检异常。虽然我可能是错的。你为什么想要一个通用的"throws Exception"声明呢?

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

by
这主要是为了向下兼容。有大量的Java代码使用了该接口,并在声明抛出异常的实现中抛出受检异常。要全部修改这些代码将是一项巨大的工作。

我之所以在Java中重新编写该接口,是因为我想在Clojure中实现该接口,但Java代码已经使用了Clojure,因此存在一个循环依赖,Java需要先构建Clojure,而Clojure也需要先构建Java。我本可以将它提取到第三方库中,但这也很麻烦,所以我希望能直接在Clojure中创建该接口。
by
你能发布一些关于你试图达到的更多示例代码吗?Clojure禁止命名空间的循环依赖,但在Java接口/类领域中通常是没有问题的。
by
这是在构建层面的问题。我有一个混合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 代码。
...