如何在Clojure中实现具有具体类型参数的接口?

3

我正在尝试从Clojure使用AWS Lambda。这是可以工作的Java代码:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class Dbmgmt implements RequestHandler<Object, Object> {

    @Override
    public String handleRequest(Object in, Context ctx) {
        System.out.println("ok");
        ctx.getLogger().log("ok");
        return "ok";
    }
}

以下是无法正常运行的Clojure代码。

(defn -handleRequest [this in ctx]
  (reify RequestHandler
    (handleRequest [this in ctx] "ok")))

使用Javap查看两个类:

Java:

Compiled from "Dbmgmt.java"
public class com.streambright.Dbmgmt implements com.amazonaws.services.lambda.runtime.RequestHandler<java.lang.Object, java.lang.Object> {
  public com.streambright.Dbmgmt();
  public java.lang.String handleRequest(java.lang.Object, com.amazonaws.services.lambda.runtime.Context);
  public java.lang.Object handleRequest(java.lang.Object, com.amazonaws.services.lambda.runtime.Context);
}

Clojure:

public class dbmgmt implements com.amazonaws.services.lambda.runtime.RequestHandler {
  public static {};
  public dbmgmt();
  public boolean equals(java.lang.Object);
  public java.lang.String toString();
  public int hashCode();
  public java.lang.Object clone();
  public java.lang.Object handleRequest(java.lang.Object, com.amazonaws.services.lambda.runtime.Context);
  public static void main(java.lang.String[]);
}

我在想实现具有具体返回类型的接口的最佳方法是什么。使用当前代码,AWS会抱怨:
"errorMessage": "Class dbmgmt does not implement RequestHandler with concrete type parameters"
2个回答

3

看起来你没有使用返回类为StringhandleRequest方法,只有Object。您可以将其作为方法名的“类型提示”:

(reify RequestHandler
  (^String handleRequest [this ^Object in ^Context ctx] "ok")))

(编辑: 撤销编辑,但添加完整的类型提示,似乎是必需的。)


1
是的,我也在考虑同样的事情,不幸的是它没有起作用。 - Istvan

0
我能想到的最接近解决这个问题的方法是以下内容:
(ns dbmgmt
  (:gen-class
    :implements [com.amazonaws.services.lambda.runtime.RequestHandler]
    :methods [[handleRequest [Object com.amazonaws.services.lambda.runtime.Context] String]]))

这将生成以下类:

public class dbmgmt implements com.amazonaws.services.lambda.runtime.RequestHandler {
  public static {};
  public dbmgmt();
  public boolean equals(java.lang.Object);
  public java.lang.String toString();
  public int hashCode();
  public java.lang.Object clone();
  public java.lang.Object handleRequest(java.lang.Object, com.amazonaws.services.lambda.runtime.Context);
  public java.lang.String handleRequest(java.lang.Object, com.amazonaws.services.lambda.runtime.Context);
  public static void main(java.lang.String[]);
}

然而,它仍然没有Java版本具有的RequestHandler。我认为目前纯粹使用Clojure实现这一点是不可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接