首页 > 解决方案 > 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 模式使用时,我收到了“未找到匹配字段”的错误消息。

标签: clojureproxyabstract-classclojure-java-interop

解决方案


(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))

推荐阅读