2
爲了註釋clojang,我在調用重載Java方法的協議方法上遇到了一些麻煩。我從'clojang.jinterface.otp.nodes
縮小問題到以下最低棘手的情況:如何正確註釋重載的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的Javadoc,AbstractNode.createTransport
可以採取java.lang.String
或java.net.InetAddress
爲addr
。雖然我相信我已在ann-protocol
表單中正確註釋了這一點,但core.typed
抱怨實施(在示例的最後一行)。我懷疑我可以用t/inst
來解決這個問題,但還沒有找出確切的咒語。
我知道可以在型提示,^String
或^InetAddress
從相應t/IFn
形式添加到arglist中(在第二至示例的最後一行),並刪除其他條款之上,但如何可以告訴core.typed
,要麼類型是可行的?