用Java编写的类是否可以实现用Clojure编写的协议?

时间:2014-01-15 18:28:57

标签: java clojure

我只能找到关于逆的东西;使用Clojure实现Java接口。但是,我想在Clojure中编写一个程序,并允许用Java扩展它。例如:

# P.clj
(defprotocol P
  (f [a])
  (g [a b]))

# I.java
public class I implements P {
    public Object f(Object a) { … }
    public Object g(Object a, Object b) { … }
}

另外,我如何指定参数类型,所以我不必在任何地方使用Object

我目前看到的唯一选择是使用点符号并依赖于duck typing,但我更喜欢Java端的接口实现的编译时验证。

2 个答案:

答案 0 :(得分:7)

是的,这很可能,就像那样。

来自docs的相关部分:

  

defprotocol将自动生成一个与协议同名的相应接口,即给定一个协议my.ns / Protocol,一个接口my.ns.Protocol。该接口将具有与协议功能相对应的方法,并且协议将自动与接口的实例一起使用。

并回答你的问题:

  

希望参与协议的Java客户端可以通过实现协议生成的接口来最有效地完成此任务。

答案 1 :(得分:2)

正如艾萨克所说,是的。

然而,没有来源代表,我认为这是一种马匹声称。请注意,我说的时候,我不是指Isaac的答案。我指的是Clojure在这种情况下的工作方式。

如果您需要Java互操作,您可能希望坚持使用枯燥的Java接口。我认为它也可以更容易与JVM中的其他语言进行互操作,因为它是最不常见的分母。我还认为这样可以更轻松地与非Clojure开发人员进行沟通。