Clojure прокси, реализующий абстрактный класс с защищенным конструктором - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь внедрить этот защищенный конструктор из этого абстрактного Java-класса в мой проект clojure. Если я напишу:

(org.everit.json.schema.Schema.) 

тогда я получаю сообщение об ошибке:

CompilerException java.lang.IllegalArgumentException: No matching ctor found
for class org.everit.json.schema.Schema.

Я ясно вижу конструктор, но вижу, что он защищен. Я читал о proxy и gen-class, но я не могу понять, как расширить этот абстрактный класс для моего проекта, чтобы я мог использовать конструктор без необходимости переопределять его.

Из моего исследования кажется, что я должен перезаписать его. Может ли кто-нибудь помочь мне с тем, должен ли я или нет? Благодарю.

Я вижу, что схема расширена до ObjectSchema и StringSchema для реализаций, поэтому я также импортировал их, но я получаю сообщения об ошибке "Не найдено подходящего поля" при попытке использовать его против строковой схемы или JSONObject схемы.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Посмотрите на этот ответ: Создайте класс, который расширяет класс с переопределением в clojure

Вы также можете создать подкласс Java, а затем использовать взаимодействие из Clojure для доступа к нему.

Вот еще один ответ: Как вызвать суперкласс при расширении класса Java с использованием genclass в Clojure?

0 голосов
/ 01 ноября 2018

(org.everit.json.schema.Schema.) вызывает конструктор, который не принимает аргументов, т. Е .:

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

Согласно Спецификации языка Java, если класс объявляет хотя бы один конструктор, конструктор по умолчанию без аргументов не будет сгенерирован компилятором. Так как класс Schema определяет этот один конструктор, таким образом, компилятор не сгенерирует конструктор без аргументов, и единственный конструктор, доступный в этом классе, это Schema(Builder<?> builder).

Здесь показано, как можно создать фиктивные экземпляры Schema.Builder и Schema, используя proxy в REPL:

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