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”呢?

我个人采取的做法(因为我认为检查型异常是一种糟糕的想法)是,当我写下的代码可能会抛出这种异常时,我就将其放在try-catch块中,将检查型异常封装成一个RuntimeException,然后抛出它。

这主要是因为向后兼容性考虑。有很多现有的Java代码使用了该接口及其实现,其中声明抛出异常,实现则抛出检查型异常,这需要大量工作去修改。

我之所以在新写这个Java接口,是因为我想在Clojure中实现这个接口,但Java代码已经使用了Clojure,这就产生了循环依赖问题,Java需要先构建Clojure,而Clojure也需要先构建Java。我可以把它抽组成一个第三方库,但这也很麻烦,所以我希望能在Clojure中直接创建这个接口。
Beau Fabry
你能提供更多你想要实现的代码示例吗?Clojure禁止namespaces间的循环依赖,但在Java接口/类中通常是可以的。
didibus
这个问题是在构建级别。我有一个混合了Clojure/Java的项目。Java通过一些gen-class调用Clojure代码,因此我必须首先构建Clojure,这样Java编译时能够找到要链接的gen-class。但是,在某个地方,我想让一个Clojure gen-class实现一个Java接口。在这种情况下,当Clojure编译gen-class时,它失败了,因为它找不到接口的类文件,因为Java还没有构建。

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