【问题标题】:How do I properly annotate overloaded Java methods?如何正确注释重载的 Java 方法?
【发布时间】: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.Stringjava.net.InetAddress 作为 addr。虽然我相信我已经在ann-protocol 表单中正确注释了这一点,但core.typed 抱怨实现(在示例的最后一行)。我怀疑我可以使用t/inst 以某种方式解决此问题,但尚未理清确切的咒语。

我知道我可以将类型提示 ^String^InetAddress 添加到 arglist(在示例的倒数第二行)并从上面对应的 t/IFn 表单中删除另一个子句,但是如何我告诉core.typed,这两种类型都可行?

【问题讨论】:

    标签: java clojure clojure-core.typed


    【解决方案1】:

    在 IRC 上与 Ambrose 进行了简短讨论后,我们达成的解决方案是在 (string? addr) 上进行分支,如下所示:

    (create-transport [this addr port-num]
      (if (string? addr)
        (.createTransport this ^String addr port-num)
        (.createTransport this ^InetAddress addr port-num)))
    

    并将IFn 注释替换为:

    [AbstractNodeObject (t/U String InetAddress) int -> (t/Nilable OtpTransport)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2016-11-22
      • 2020-04-22
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多