首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Clojure中的defrecord扩展Java类?

如何使用Clojure中的defrecord扩展Java类?
EN

Stack Overflow用户
提问于 2020-09-02 04:46:14
回答 2查看 333关注 0票数 0

根据我的研究,扩展Java类的方法基本上是使用名称空间中的gen类或代理。但是,看看选择类型流程图,它似乎表明我可以使用记录来扩展一个Java类:

  1. 该类型是否需要扩展Java类或实现任何接口?是
  2. 您需要命名类型还是只需要匿名类型的实例?命名类型
  3. 您需要能够从Java静态地引用类吗?不是
  4. 您的类建模是否是一个域值,从而受益于类似hasmap的功能和语义?是

使用解除记录

所以问题是..。多么?

例如(来自):

代码语言:javascript
运行
复制
public final class Second extends Struct {
    public final Signed32 a_number = new Signed32();
    public Second(final Runtime runtime) {
        super(runtime);
    }
}

public final class Top extends Struct {              
    public final Second second = inner(new Second(getRuntime()));  
    public final Second[] seconds = array(new Second[5]);
    public final Signed32 another_number = new Signed32();
    public final Signed32[] more_numbers = array(new Signed32[5]);
    public Top(final Runtime runtime) {
        super(runtime);
    }
}

我是不是..。

代码语言:javascript
运行
复制
(defrecord Second)
(extend jnr.ffi.Struct
        Second)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-02 05:02:28

我认为流程图是错的。通过查看Clojure -数据类型: deftype、defrecord和reify文档,我们可以看到:

  • deftype/defrecord可以实现一个或多个协议和/或接口

没有提到扩展现有类。实际上,在本身中,除了作为特例的Object之外,没有提到扩展现有类。

对不起,看来proxygen-class是您唯一的选择。

票数 1
EN

Stack Overflow用户

发布于 2020-09-02 05:34:49

为什么你需要一个命名的类型?如果,正如您所说的,您不需要从Java静态地引用它,我看不出有什么特别的理由来命名类型。如果你正确回答了这个问题,它就会引导你进入proxy。你的问题是你选择了不一致的答案:你说你需要一个命名的类,但不要对你可能需要的任何理由回答是。流程图所考虑的原因是Java代码可能希望按名称引用您的代码,在这种情况下是gen-class。但是,一方面您必须扩展Java类,另一方面您的新类型将是一个简单的数据载体,对域值进行建模,这是没有什么意义的。Clojure记录在这方面做得很好,但是拥有一个来自Java的令人讨厌的可变基类并不能成为一个好的域对象。

也就是说,如果您对“域类型建模”回答为"no“,它将导致您使用deftype,它也不能扩展一个类。我认为,如果您想要扩展一个类,那么它允许您逃离“互操作区域”是一个错误:最好将接口和子类分开,但是流程图只能如此大。

FWIW 对原流程图帖子的评论包含了您的问题,作者给出了一个答复,响应了我关于使用proxy的建议,以及流程图已经足够大的问题:

第一个决定并不是只表示您需要扩展一个类-它包括实现接口。所以,这里有点含糊不清。当然,你在那里的阶级社会,但打破更多的东西,以消除歧义会使流程图更大一点,我认为。 FWIW,我会亲自删除那里的命名类型需求,使用代理,只需处理(类(创建-代理-实例…)的结果)。例如?检查之类的(假设这就是为什么需要指定类型)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63698850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档