Clojure:多种提示?

时间:2015-03-18 19:06:08

标签: clojure clojure-java-interop

如何为变量指定两种类型的可能性?

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

谢谢!

2 个答案:

答案 0 :(得分:2)

来自Clojure documentation

  

Clojure支持使用类型提示来帮助编译器避免在性能关键的代码区域中反映。通常,在存在已知性能瓶颈之前,应避免使用类型提示

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

(defn connect! [^String host])

您告诉编译器在编译时将host上的所有Java互操作方法调用解析为String类上的方法调用。允许使用多个类提示表单将无法实现此目的 - 编译器不会知道编译方法调用的类。即使它确实如此,对象也不能同时是StringInetAddress,因此任何针对String类编译的方法调用都将保证失败并且{{1如果恰好传递了ClassCastException,反之亦然。

答案 1 :(得分:1)

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

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