我只能找到关于逆的东西;使用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端的接口实现的编译时验证。
答案 0 :(得分:7)
是的,这很可能,就像那样。
来自docs的相关部分:
defprotocol将自动生成一个与协议同名的相应接口,即给定一个协议my.ns / Protocol,一个接口my.ns.Protocol。该接口将具有与协议功能相对应的方法,并且协议将自动与接口的实例一起使用。
并回答你的问题:
希望参与协议的Java客户端可以通过实现协议生成的接口来最有效地完成此任务。
答案 1 :(得分:2)
正如艾萨克所说,是的。
然而,没有来源代表,我认为这是一种马匹声称。请注意,我说的时候,我不是指Isaac的答案。我指的是Clojure在这种情况下的工作方式。
如果您需要Java互操作,您可能希望坚持使用枯燥的Java接口。我认为它也可以更容易与JVM中的其他语言进行互操作,因为它是最不常见的分母。我还认为这样可以更轻松地与非Clojure开发人员进行沟通。