当前位置: 首页 > 面试题库 >

如何将类型集合从clojure传递给Java?

苏嘉歆
2023-03-14
问题内容

我知道clojure /
java互操作的基础:从clojure调用Java,反之亦然。但是,我无法将类型的集合从clojure返回到Java。我试图List<TypedObject>从正在调用clojure的Java代码中看到这种性质的东西。

Java Object:

public class TypedObject {
    private OtherType1 _prop1;
    public OtherType1 getProp1() {
        return _prop1;
    }
    public void setProp1(OtherType1 prop1) {
        _prop1 = prop1;
    }
}

CLojure method:

(defn -createListOfTypedObjects
      "Creates and returns a list of TypedObjects"
      [input]
      ;Do work here  to create and return list of TypedObjects
      [typedObj1, typedObj2, typedObj3])

(:gen-class
 :name some.namespace
 :methods [createListofTypedObjects[String] ????])

让我们考虑一下,我正在使用clojure编写API,该API将作为jar文件分发,可以从Java使用。我的问题确实是如何代替???AOT的:gen-
class里面有问号,因此,例如,使用我的api在Java中编写一段代码的程序员可以createListofTypedObjects() returns List<TypedObject>在eclipse中进行适当的intellisense /代码完成(即:)。


问题答案:

其他人是对的,Clojure不能确保返回的集合中元素的类型,等等。(实际上,JVM也不能确保集合中元素的类型,这完全由javac处理。)

但是,我看到了向其他Java程序员提供API的价值,该API指定了一个接口,该接口声明以各种方式对参数化的返回值(或参数)进行了参数化;如果人们希望在现有的Java环境中使用Clojure而不产生麻烦,那么这将特别有吸引力。

当前,这需要两步过程:

  • 定义一个单独的接口(在Java中!),可以根据需要指定参数化类型
  • 定义你的gen-class命名空间(或proxyreify实例),使得它实现该接口

(Clojure确实提供了一种definterface格式,可以避免使用单独的Java接口定义,但是definterface,与Clojure的其余部分一样,Clojure也没有提供指定参数化类型的方法。也许有一天…
:-))

例如

public interface IFoo {
    List<TypedObject> createListOfTypedObjects ();
}

然后是您的gen-class名称空间:

(ns your.ns.FooImpl
  (:gen-class
    :implements [IFoo]))
(defn -createListOfTypedObjects
  []
  [typedObj1, typedObj2, typedObj3])

当您的用户创建的实例时FooImpl,他们将例如获得代码完成,表明该方法返回List<TypedObject>而不Object是非参数化List类型。

如果您使用健全的构建工具(例如maven,gradle或正确配置的ant),则可以将Java接口放入Clojure项目中,并将处理跨语言依赖性。



 类似资料:
  • 问题内容: 这是我的基本功能: 此功能能够连接并在我的数据库上执行查询… 我想创建相同的功能,但更通用。…前一个仅用于一个表(),新表必须能够接受查询的参数作为输入,以及将在其中执行查询的类类型。这将允许我仅使用一行来执行查询。 应该是这样的: 您发现我不知道如何“通用”代码… 我希望已经清楚了… PS 应该是DB()中表的类的代表。 谢谢。 问题答案: 如果您打算返回结果集,请使用:

  • 问题内容: 我有主片段,我想传递给类,在这里我将在ListView中显示结果。 片段类: 我有资料 现在,我想将“ allStudents”对象发送到新的活动类StudentResult();中。 我在片段类中使用: 在目标类中显示ListView()中的对象; 提前致谢! 问题答案: 在您的Fragment中创建一个自定义界面: 在您的活动中实现此接口: 现在,您必须重写声明的方法(在中): 然

  • 我是新的TypeScript和我正在努力写HOC与typecheck。这是我的HOC: 它抛出一个错误: 类型(组件:反应。组件类型 我完全不知道如何继续使用这段代码,也不知道如何让它工作。 有什么想法吗?

  • 我正在尝试按房间类别(手术室或技术室)返回过滤后的

  • 我在C中有一个函数,我需要在Java中创建一个包装器。该函数期望FILE类型的输入参数(来自标准输入输出)。我不相信Swig可以在Java中自动适应一个接口,而不需要在Swig接口文件中进行一些手动工程-我可能错了。 这是我所拥有的 C(标题h): 我尝试过编译,但结果是创建了Swig指针类型:SWIGTYPE_p_FILE,这无助于我将FILE type参数从Java传递到C。

  • 问题内容: 我在形成文字时可能做错了。假设我有一个简单的存储过程,如下所示: 的定义为: 执行这样的查询: 产生以下结果集: 代替: 我的文字是否有问题,还是应该以其他方式访问该字段?感谢您的任何建议。 问题答案: 指定输入的方式看起来不错,因为使用行和数组构造器语法可以观察到相同的行为: 和: 产生: 如果添加: 在循环内部,输出为: 表明您实际上正在获取一个元组,其中“ message”是您期