【问题标题】:Clojure proxy implementing abstract class with protected constructorClojure 代理使用受保护的构造函数实现抽象类
【发布时间】:2018-10-31 19:08:50
【问题描述】:

我正在尝试将 this protected constructorthis 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 使用时出现“未找到匹配字段”的错误架构。

【问题讨论】:

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


    【解决方案1】:

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

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

    根据 Java 语言规范,如果一个类声明了至少一个构造函数,则编译器不会生成默认的无参数构造函数。由于Schema 类定义了一个构造函数,因此编译器不会生成无参数构造函数,并且此类中唯一可用的构造函数是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))
    

    【讨论】:

    • 经过这个解释,我明白了,谢谢。我已经在 REPL 中完成了,我可以通过在 REPL 中使用 type 关键字来检查是否存在正确的类型。 Schema 有一个方法是 validate,然后你传递给它一个 JSON 对象。如何将此方法与这个新创建的 Schema 对象一起使用?
    • 我看到 Schema 已扩展为 ObjectSchema 和 StringSchema 以进行实现,所以我也导入了这些,但是在尝试使用时出现“未找到匹配字段”的错误字符串模式或 JSONObject 模式。感谢您的帮助。
    【解决方案2】:

    看看这个答案: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?

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 2013-11-13
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2013-08-29
      • 2012-08-18
      • 2011-05-30
      • 2019-11-18
      相关资源
      最近更新 更多