在< cocktails>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创建声明方法抛出子句的接口?

2个答案

+1

选定
 
最佳答案

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

创建类似于这样的自定义接口的最佳方法是使用Java定义它们。

0

我认为 gen-class 或 gen-interface 都不支持检查异常。我可能在这一点上是错的。你为什么想要一个通用的 "抛出 Exception" 声明?

就我个人而言(因为我认为检查异常是一个糟糕的主意),当我的代码可能抛出异常时,我只是用 try-catch 包装它,在 RuntimeException 中包装检查异常,然后抛出。

这主要为了保持向后兼容性。有很多现有的Java代码使用该接口并实现它,其中声明抛出异常,它们的实现抛出检查异常。要更改所有这些将是一项大量工作。

我之所以在Java中重新编写接口,是因为我想在Clojure中实现该接口,但由于Java代码已经使用了Clojure,因此存在循环依赖性,Java需要先构建Clojure,而Clojure需要先构建Java。我可以将其提取到一个第三方库中,但这也很麻烦,所以我希望能够在Clojure中直接创建接口。
你能发布一些你试图达到的示例代码吗?Clojure禁止命名空间间的循环依赖,但在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代码。
...