Clojure代理使用受保护的构造函数实现抽象类

时间:2018-10-31 19:08:51

标签: clojure proxy abstract-class clojure-java-interop

我正在尝试从this protected constructor实现this abstract Java class到我的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进行尝试时出现了提示“找不到匹配字段”的错误。模式。

2 个答案:

答案 0 :(得分:1)

(org.everit.json.schema.Schema.)调用不接受任何参数的构造函数,即:

class Schema {
  protected Schema() {
    ...
  }
}

根据Java语言规范,如果一个类声明了至少一个构造函数,则编译器将不会生成默认的no-arg构造函数。由于Schema类定义了一个构造函数,因此编译器将不会生成no-arg构造函数,并且该类中唯一可用的构造函数是Schema(Builder<?> builder)

这显示了如何在REPL中使用proxy创建Schema.BuilderSchema的虚拟实例:

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

答案 1 :(得分:0)

看看这个答案:Make a class that extends a class with overriding in clojure

您还可以创建Java子类,然后使用Clojure中的互操作来访问它。

这里是另一个答案:How to call super class when extending a Java class using genclass in Clojure?