Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保clojure变量是正确的Java类型_Java_Clojure_Apache Poi - Fatal编程技术网

如何确保clojure变量是正确的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 请注意

java代码
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] ...)