Clojure:多种类型的提示?

Clojure: multiple type hints?

如何给一个变量指定两种类型的可能性?

(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)

谢谢!

来自Clojure documentation

Clojure supports the use of type hints to assist the compiler in avoiding reflection in performance-critical areas of code. Normally, one should avoid the use of type hints until there is a known performance bottleneck

类型提示的目的是让编译器避免反射。类型提示代码的任何自我文档方面都是次要的。当您说出以下内容时:

(defn connect! [^String host])

您告诉编译器的是在编译时将 host 上的所有 Java 互操作方法调用解析为 String class 上的方法调用。允许用多个 class 提示表单会破坏此目的 - 编译器不知道将方法调用编译为哪个 class。即使是这样,一个对象也不能同时是 StringInetAddress,因此针对 String class 编译的任何方法调用都将保证失败如果刚好传入一个InetAddress,则为ClassCastException,反之

据我所知,唯一的方法是自己检查并在 let 中添加提示:

(condp instance? host
  String (let [^String s] (...))
  InetAddress (let [^InetAddress a] (...)))