clojure如何正确注释重载的Java方法?
在注释clojang的过程中,我遇到了一些调用重载Java方法的协议方法的问题。我已经把问题缩小到了^{
(ns clojang.jinterface.otp.nodes
(:require [clojure.core.typed :as t :refer [ann ann-protocol]]
[clojure.core.typed.utils :refer [defprotocol]])
(:import [com.ericsson.otp.erlang OtpTransport]
[java.net InetAddress])
(:refer-clojure :exclude [defprotocol]))
(ann-protocol AbstractNodeObject
create-transport
(t/IFn [AbstractNodeObject InetAddress int -> (t/Nilable OtpTransport)]
[AbstractNodeObject String int -> (t/Nilable OtpTransport)]))
(defprotocol AbstractNodeObject
(create-transport [this addr port-num]
"Create instance of ``OtpTransport``."))
(extend-type AbstractNode
AbstractNodeObject
(create-transport [this addr port-num]
(.createTransport this addr port-num)))
根据JInterface Javadocs,^{java.lang.String
或java.net.InetAddress
作为addr
。虽然我相信我已经在ann-protocol
表单中正确地注释了这一点,但core.typed
抱怨了实现(在示例的最后一行)。我怀疑我能用t/inst
解决这个问题,但还没有弄清楚确切的咒语
我知道我可以将类型提示^String
或^InetAddress
添加到arglist(在示例的倒数第二行)中,并从上面相应的t/IFn
表单中删除另一个子句,但是我如何判断core.typed
这两种类型都是可行的呢
# 1 楼答案
在与安布罗斯就IRC进行简短讨论后,我们达成的解决方案是在
(string? addr)
上分支,如下所示:并将
IFn
注释替换为: