【发布时间】:2016-02-06 13:22:27
【问题描述】:
在注释clojang 时,我在调用重载Java 方法的协议方法上遇到了一些问题。我已将问题缩小到'clojang.jinterface.otp.nodes 中的以下最小棘手案例:
(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,AbstractNode.createTransport 可以采用 java.lang.String 或 java.net.InetAddress 作为 addr。虽然我相信我已经在ann-protocol 表单中正确注释了这一点,但core.typed 抱怨实现(在示例的最后一行)。我怀疑我可以使用t/inst 以某种方式解决此问题,但尚未理清确切的咒语。
我知道我可以将类型提示 ^String 或 ^InetAddress 添加到 arglist(在示例的倒数第二行)并从上面对应的 t/IFn 表单中删除另一个子句,但是如何我告诉core.typed,这两种类型都可行?
【问题讨论】:
标签: java clojure clojure-core.typed