2024 Clojure状态调查中分享您的看法!

欢迎!请访问关于页面以获取更多关于如何操作的信息。

0
Clojure

我正在尝试使用gen-interface复制一个Java接口,其中有一些Java类实现它,并在它们定义overridden方法的时使用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中失败,报:`overridden method does not throw Exception`错误

在 Clojure 使用gen-interface 创建声明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。我原本可以将其提取到一个第三方库中,但这也相当繁琐,所以我希望只能够在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。
...