1

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

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

谢谢!

4

2 回答 2

3

Clojure 文档中:

Clojure 支持使用类型提示来帮助编译器避免对性能关键的代码区域的反射。通常,应该避免使用类型提示,直到出现已知的性能瓶颈

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

(defn connect! [^String host])

您要告诉编译器的是host在编译时将所有 Java 互操作方法调用解析为类上的方法调用String。允许使用多个类来提示表单会破坏这个目的——编译器不知道将方法调用编译为哪个类。即使是这样,一个对象也不能同时是 aString和 an ,因此如果碰巧传入了a,则InetAddress针对该类编译的任何方法调用String都将保证失败,反之亦然。ClassCastExceptionInetAddress

于 2015-03-18T19:14:20.273 回答
1

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

(condp instance? host
  String (let [^String s] (...))
  InetAddress (let [^InetAddress a] (...)))
于 2015-03-18T19:14:50.017 回答