clojure - Clojure 代理使用受保护的构造函数实现抽象类
问题描述
我正在尝试将此抽象 Java 类中的受保护构造函数实现到我的 clojure 项目中。如果我写:
(org.everit.json.schema.Schema.)
然后我收到一条错误消息:
CompilerException java.lang.IllegalArgumentException: No matching ctor found
for class org.everit.json.schema.Schema.
我清楚地看到了构造函数,但我看到它受到保护。我一直在阅读代理和 gen-class,但我不明白如何将这个抽象类扩展到我的项目,以便我可以使用构造函数而不必重写它。
根据我的研究,似乎我必须覆盖它。有人可以帮我解决我是否必须这样做吗?谢谢。
我看到 Schema 已扩展为 ObjectSchema 和 StringSchema 以进行实现,因此我也导入了这些,但是在尝试针对字符串模式或 JSONObject 模式使用时,我收到了“未找到匹配字段”的错误消息。
解决方案
(org.everit.json.schema.Schema.)
调用不接受任何参数的构造函数,即:
class Schema {
protected Schema() {
...
}
}
根据 Java 语言规范,如果一个类声明了至少一个构造函数,则编译器不会生成默认的无参数构造函数。由于Schema
类定义了一个构造函数,因此编译器不会生成无参数构造函数,并且此类中唯一可用的构造函数是Schema(Builder<?> builder)
.
这显示了如何创建 a 的虚拟实例Schema.Builder
并在 REPL 中Schema
使用:proxy
(import 'org.everit.json.schema.Schema)
(import 'org.everit.json.schema.Schema$Builder)
(defn dummy-schema-builder []
(proxy [Schema$Builder] []))
(defn dummy-schema [builder]
(proxy [Schema] [builder]
(accept [visitor]
(println "Processing" visitor))))
(dummy-schema
(dummy-schema-builder))
推荐阅读
- python - 如何使用 convert_coreml 转换自定义管道(分类 get_dummies)?
- r - R DT & blogdown - 创建表导致“路径太长”
- python - 为什么推文总是被识别为字节,而不是字符串?
- c++ - 具有 unique_ptr 的结构向量
- python-3.x - 有没有一种计算上更有效的方法来将数千个列表与边界值进行比较?Python
- java - 如何在邮递员中发送包含数组列表的对象
- r - 更新 R 表达式
- javascript - Electron:动态上下文菜单
- c# - 从 Mono.Cecil 获取 .NET 类型
- snapcraft - Snapcraft:找不到可执行文件