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
Java 使用Clojure的静态方法_Java_Clojure - Fatal编程技术网

Java 使用Clojure的静态方法

Java 使用Clojure的静态方法,java,clojure,Java,Clojure,我试图在Clojure中实现以下内容: (ns harrow.http (:require ; harrow ; external [clojure.tools.logging :as log ] ) (:import [org.rapidoid.config Conf ] [org.rapidoid.setup On OnRoute ] [org.rapidoid.htt

我试图在Clojure中实现以下内容:

(ns harrow.http
  (:require
    ; harrow
    ; external
    [clojure.tools.logging  :as log       ] )
  (:import
    [org.rapidoid.config    Conf              ]
    [org.rapidoid.setup     On OnRoute        ]
    [org.rapidoid.http.impl RouteOptions      ]
    [org.rapidoid.http      Req               ]
    [org.rapidoid.u         U                 ]
    [java.util              Map LinkedHashMap ] ) )

(gen-class
  :name harrow.EchoHandler
  :methods [ #^{:static true} [handleEcho [org.rapidoid.http.Req] java.util.Map]] )
(defn -handleEcho ^Map [^Req req] (U/map (.headers req)))
处理程序:

// http/handlers/EchoHandler.java
package http.handlers;

import org.rapidoid.http.Req;
import org.rapidoid.u.U;

import java.util.Map;

public class EchoHandler {

    public static Map<String, String> handleEcho(Req req) {
        return U.map(req.headers());
    }
}
现在尝试在Clojure中执行同样的操作:

(ns harrow.http
  (:require
    ; harrow
    ; external
    [clojure.tools.logging  :as log       ] )
  (:import
    [org.rapidoid.config    Conf              ]
    [org.rapidoid.setup     On OnRoute        ]
    [org.rapidoid.http.impl RouteOptions      ]
    [org.rapidoid.http      Req               ]
    [org.rapidoid.u         U                 ]
    [java.util              Map LinkedHashMap ] ) )

(gen-class
  :name harrow.EchoHandler
  :methods [ #^{:static true} [handleEcho [org.rapidoid.http.Req] java.util.Map]] )
(defn -handleEcho ^Map [^Req req] (U/map (.headers req)))
使用它:

harrow.main=> (def config-get-route (http/set-http-get-route "/echo"))
harrow.main=> (import harrow.EchoHandler)
harrow.EchoHandler
harrow.main=> (.json config-get-route EchoHandler/handleEcho)

CompilerException java.lang.RuntimeException: Unable to find static field: handleEcho in class harrow.EchoHandler, compiling:(/private/var/folders/nr/g50ld9t91c555dzv91n43bg40000gn/T/form-init16236167396076700327.clj:1:1)

我想知道在Clojure中使用静态方法的正确方法是什么。

首先,您不能将静态方法作为函数传递-您必须 用anon fn把它包起来

撇开这一点不谈,这也行不通,因为这个框架期望 实现某些接口的实例。由于Java8,您可以编写 作为lambdas和javac,如果接口只是 有一种方法

因此,您不能简单地传入Clojure函数,该函数实现。
IFn
Runnable
,但不需要特定的接口。所以 您必须从文档中查找允许的内容,并将其具体化

例如,使用Rapidoid 5.5.5时,它可以如下所示:

(ns try-rapidoid.core
  (:import (org.rapidoid.http ReqHandler)
           (org.rapidoid.setup On Setup)))

(def echo-route
  (doto
    (On/get "/echo")
    (.managed true)
    (.json (reify ReqHandler ; XXX
             (execute [this ^Object req]
               (.headers req))))))

#_(Setup/shutdownAll)

首先,您不能将静态方法作为函数传递—您必须这样做 用anon fn把它包起来

撇开这一点不谈,这也行不通,因为这个框架期望 实现某些接口的实例。由于Java8,您可以编写 作为lambdas和javac,如果接口只是 有一种方法

因此,您不能简单地传入Clojure函数,该函数实现。
IFn
Runnable
,但不需要特定的接口。所以 您必须从文档中查找允许的内容,并将其具体化

例如,使用Rapidoid 5.5.5时,它可以如下所示:

(ns try-rapidoid.core
  (:import (org.rapidoid.http ReqHandler)
           (org.rapidoid.setup On Setup)))

(def echo-route
  (doto
    (On/get "/echo")
    (.managed true)
    (.json (reify ReqHandler ; XXX
             (execute [this ^Object req]
               (.headers req))))))

#_(Setup/shutdownAll)

首先,您不能将静态方法作为函数传递-您必须将其包装在anon fn中。另外,我打赌那里的java代码使用一个方法接口,javac在那里为您构建处理类。因此,您很可能需要具体化
json
方法所期望的接口。谢谢您提供的信息。你介意给我举个例子吗?如何用anon fn包装这个?提前谢谢!首先,您不能将静态方法作为函数传递-您必须将其包装在anon fn中。另外,我打赌那里的java代码使用一个方法接口,javac在那里为您构建处理类。因此,您很可能需要具体化
json
方法所期望的接口。谢谢您提供的信息。你介意给我举个例子吗?如何用anon fn包装这个?提前谢谢!