我正在尝试从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进行尝试时出现了提示“找不到匹配字段”的错误。模式。
答案 0 :(得分:1)
(org.everit.json.schema.Schema.)
调用不接受任何参数的构造函数,即:
class Schema {
protected Schema() {
...
}
}
根据Java语言规范,如果一个类声明了至少一个构造函数,则编译器将不会生成默认的no-arg构造函数。由于Schema
类定义了一个构造函数,因此编译器将不会生成no-arg构造函数,并且该类中唯一可用的构造函数是Schema(Builder<?> builder)
。
这显示了如何在REPL中使用proxy
创建Schema.Builder
和Schema
的虚拟实例:
(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?