如何为一个变量指定两种类型的可能性?
(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)
谢谢!
如何为一个变量指定两种类型的可能性?
(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)
谢谢!
从Clojure 文档中:
Clojure 支持使用类型提示来帮助编译器避免对性能关键的代码区域的反射。通常,应该避免使用类型提示,直到出现已知的性能瓶颈
类型提示的目的是让编译器避免反射。类型提示代码的任何自文档方面都是次要的。当您说以下内容时:
(defn connect! [^String host])
您要告诉编译器的是host
在编译时将所有 Java 互操作方法调用解析为类上的方法调用String
。允许使用多个类来提示表单会破坏这个目的——编译器不知道将方法调用编译为哪个类。即使是这样,一个对象也不能同时是 aString
和 an ,因此如果碰巧传入了a,则InetAddress
针对该类编译的任何方法调用String
都将保证失败,反之亦然。ClassCastException
InetAddress
据我所知,唯一的方法是自己进行检查并在 let 中添加提示:
(condp instance? host
String (let [^String s] (...))
InetAddress (let [^InetAddress a] (...)))