根据我的研究,扩展Java类的方法基本上是使用名称空间中的gen类或代理。但是,看看选择类型流程图,它似乎表明我可以使用记录来扩展一个Java类:
使用解除记录
所以问题是..。多么?
例如(来自这):
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);
}
}
我是不是..。
(defrecord Second)
(extend jnr.ffi.Struct
Second)
发布于 2020-09-01 21:02:28
我认为流程图是错的。通过查看Clojure -数据类型: deftype、defrecord和reify文档,我们可以看到:
没有提到扩展现有类。实际上,在本身中,除了作为特例的Object
之外,没有提到扩展现有类。
对不起,看来proxy
或gen-class
是您唯一的选择。
发布于 2020-09-01 21:34:49
为什么你需要一个命名的类型?如果,正如您所说的,您不需要从Java静态地引用它,我看不出有什么特别的理由来命名类型。如果你正确回答了这个问题,它就会引导你进入proxy
。你的问题是你选择了不一致的答案:你说你需要一个命名的类,但不要对你可能需要的任何理由回答是。流程图所考虑的原因是Java代码可能希望按名称引用您的代码,在这种情况下是gen-class
。但是,一方面您必须扩展Java类,另一方面您的新类型将是一个简单的数据载体,对域值进行建模,这是没有什么意义的。Clojure记录在这方面做得很好,但是拥有一个来自Java的令人讨厌的可变基类并不能成为一个好的域对象。
也就是说,如果您对“域类型建模”回答为"no“,它将导致您使用deftype
,它也不能扩展一个类。我认为,如果您想要扩展一个类,那么它允许您逃离“互操作区域”是一个错误:最好将接口和子类分开,但是流程图只能如此大。
FWIW 对原流程图帖子的评论包含了您的问题,作者给出了一个答复,响应了我关于使用proxy
的建议,以及流程图已经足够大的问题:
第一个决定并不是只表示您需要扩展一个类-它包括实现接口。所以,这里有点含糊不清。当然,你在那里的阶级社会,但打破更多的东西,以消除歧义会使流程图更大一点,我认为。 FWIW,我会亲自删除那里的命名类型需求,使用代理,只需处理(类(创建-代理-实例…)的结果)。例如?检查之类的(假设这就是为什么需要指定类型)。
https://stackoverflow.com/questions/63698850
复制相似问题