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 在传递非基本体对象数组时避免反射_Clojure - Fatal编程技术网

Clojure 在传递非基本体对象数组时避免反射

Clojure 在传递非基本体对象数组时避免反射,clojure,Clojure,我正在从Clojure 1.4.0调用com.rabbitmq.client.ConnectionFactory.newConnection(地址[]),如下所示: (defn connect [#^ConnectionFactory factory, addrs] (.newConnection factory (into-array Address addrs))) 调用正常,但会抛出一个反射警告: call to newConnection can't be resolved. 考

我正在从Clojure 1.4.0调用
com.rabbitmq.client.ConnectionFactory.newConnection(地址[])
,如下所示:

(defn connect [#^ConnectionFactory factory, addrs]
  (.newConnection factory (into-array Address addrs)))
调用正常,但会抛出一个反射警告:

call to newConnection can't be resolved.
考虑到
ConnectionFactory
类,显然有一个表单只接受一个类型为
com.rabbitmq.client.Address[]
的参数,这正是
(into array Address())
返回的内容:

com.mefesto.wabbitmq=> (pprint (filter #(.. (.toString %)
                                            (contains "newConnection"))
                               (seq (.getDeclaredMethods
                                     ConnectionFactory))))
(#<Method public com.rabbitmq.client.Connection
    com.rabbitmq.client.ConnectionFactory.newConnection(
      com.rabbitmq.client.Address[])
    throws java.io.IOException>
 #<Method public com.rabbitmq.client.Connection
    com.rabbitmq.client.ConnectionFactory.newConnection(
      java.util.concurrent.ExecutorService,
      com.rabbitmq.client.Address[])
    throws java.io.IOException>
 #<Method public com.rabbitmq.client.Connection
    com.rabbitmq.client.ConnectionFactory.newConnection()
    throws java.io.IOException>
 #<Method public com.rabbitmq.client.Connection
    com.rabbitmq.client.ConnectionFactory.newConnection(
      java.util.concurrent.ExecutorService)
    throws java.io.IOException>)

com.mefesto.wabbitmq=> (into-array Address ())
#<Address[] [Lcom.rabbitmq.client.Address;@953235f>
com.mefesto.wabbitmq=>(pprint(filter#(...toString%)
(包含“新连接”))
(seq(.getDeclaredMethods)
连接工厂)
(#
#
#
#)
com.mefesto.wabbitmq=>(放入数组地址())
#

我需要做什么来避免这里的反射?

不幸的是,高阶函数总是使用Object作为参数类型,编译器还没有在调用过程中遵循类型提示。这基本上是因为它编译匿名函数

#(.. (.toString %) (contains "newConnection"))
在它知道如何使用之前。这可能很快会有所改善


如果您可以绕过对
过滤器的调用,您可能可以绕过此问题。不幸的是,高阶函数总是使用Object作为参数类型,并且编译器尚未在调用过程中遵循类型提示。这基本上是因为它编译匿名函数

#(.. (.toString %) (contains "newConnection"))
在它知道如何使用之前。这可能很快会有所改善


如果您能够绕过调用
过滤器

这是一个有用的信息,但不能直接回答我想问的问题,那么您可能可以绕过这个问题。给出的HOF并不是抛出警告的HOF——它只是演示了一个带有适当参数列表的
newConnection
方法的可用性。就这个问题而言,我关心的实际代码只是顶部第一个代码块中给出的
connect
函数,据我所知,它没有使用任何HOFs。这是有用的信息,但不是对我想问的问题的直接响应。给出的HOF并不是抛出警告的HOF——它只是演示了一个带有适当参数列表的
newConnection
方法的可用性。就这个问题而言,我关心的实际代码只是顶部第一个代码块中给出的
connect
函数,据我所知,它没有使用任何HOFs。