如何确保clojure变量是正确的Java类型
java代码如何确保clojure变量是正确的Java类型,java,clojure,apache-poi,Java,Clojure,Apache Poi,java代码XSSFRow row=sheet.getRow(p) clojure代码(def行(.getRow表p)) 我们如何确保行的类型是XSSFRow?Clojure是动态类型的,因此var/值的类型是在运行时确定的 如果要确保某个值属于某个类,可以进行以下断言: (assert (= (class row) XSSFRow)) 或者,更简洁地说(感谢opqdonut): 这不检查确切的类,但检查任何超类: (instance? Object row) ;=> true 请注意
XSSFRow row=sheet.getRow(p)代码>
clojure代码(def行(.getRow表p))
我们如何确保行的类型是XSSFRow
?Clojure是动态类型的,因此var/值的类型是在运行时确定的
如果要确保某个值属于某个类,可以进行以下断言:
(assert (= (class row) XSSFRow))
或者,更简洁地说(感谢opqdonut):
这不检查确切的类,但检查任何超类:
(instance? Object row) ;=> true
请注意,有一种方法可以使用元数据为编译器指定类型提示。在某些形式中,可以插入以下结构:
(let [^String str-val (do-something)] ...)
(def ^double y)
(defn f [^int int-arg ^"[[I" 2d-int-array] ...)
请注意^type
表达式。这是指定元数据的一个元素的缩写,即元数据映射中的:tag
键。
现在,编译器可以优化代码,直接解析对java方法的调用,而不是在知道var的确切类型后立即进行反射
clojure.org上有一个例子:。它建议,而且我认为这是正确的,不要过度使用类型提示,因为它们只是使代码混乱,通常不需要足够的性能。我希望看到标题更具描述性;e、 g.“如何确保clojure变量是正确的Java类型”。我可以自己编辑它,但我更愿意让提问者来决定。或者更简洁地说,(assert(instance?XSSFRow row))
另一方面,如果您的代码只适用于XSSFRow(即,如果传递了其他内容,则会失败),那么我认为类型提示对于文档来说是很好的,编译器不必生成反射代码这一事实是一个很好的附带好处。
(let [^String str-val (do-something)] ...)
(def ^double y)
(defn f [^int int-arg ^"[[I" 2d-int-array] ...)