gpt4 book ai didi

java - 如何正确注释重载的 Java 方法?

转载 作者:行者123 更新时间:2023-11-30 08:41:11 24 4
gpt4 key购买 nike

在工作中注释clojang ,我在使用调用重载 Java 方法的协议(protocol)方法时遇到了一些麻烦。我已将问题缩小到以下来自 '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 这两种类型都是可行的?

最佳答案

在 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)]

关于java - 如何正确注释重载的 Java 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35232631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com