有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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.Stringjava.net.InetAddress作为addr。虽然我相信我已经在ann-protocol表单中正确地注释了这一点,但core.typed抱怨了实现(在示例的最后一行)。我怀疑我能用t/inst解决这个问题,但还没有弄清楚确切的咒语

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


共 (1) 个答案

  1. # 1 楼答案

    在与安布罗斯就IRC进行简短讨论后,我们达成的解决方案是在(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)]