如何为变量指定两种类型的可能性?
(defn connect! [(or ^:String :^java.net.InetAddress) host ^:Integer port] ...)
谢谢!
答案 0 :(得分:2)
Clojure支持使用类型提示来帮助编译器避免在性能关键的代码区域中反映。通常,在存在已知性能瓶颈之前,应避免使用类型提示
类型提示的目的是允许编译器避免反射。类型提示代码的任何自我文档方面都是次要的。当您说出以下内容时:
(defn connect! [^String host])
您告诉编译器在编译时将host
上的所有Java互操作方法调用解析为String
类上的方法调用。允许使用多个类提示表单将无法实现此目的 - 编译器不会知道编译方法调用的类。即使它确实如此,对象也不能同时是String
和InetAddress
,因此任何针对String
类编译的方法调用都将保证失败并且{{1如果恰好传递了ClassCastException
,反之亦然。
答案 1 :(得分:1)
据我所知,唯一的方法是自己检查并在let中添加提示:
(condp instance? host
String (let [^String s] (...))
InetAddress (let [^InetAddress a] (...)))