Clojure 2024状态调查中分享您的观点!

欢迎!请参阅关于页面以获取有关此功能的一些更多信息。

0
Clojure

我正在尝试使用gen-interface复制一个Java接口,其中一些Java类实现了它,并在where定义它们的覆盖为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方法不抛出Exception

有方法在Clojure中使用gen-interface创建声明抛出子句的接口吗?

2 答案

+1
 
最佳答案

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

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

0

我认为gen-class或gen-interface都不支持受检异常。不过,我可能错了。你为什么要一个通用的"throws 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。但是,在某个地方,我希望有一个实现Java接口的Clojure gen-class。在这个点上,当Clojure编译gen-class时,它会失败,因为它找不到接口类文件,因为Java还没有被构建。

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