Вот интерфейс EventListener
package com.google.cloud.firestore;
public interface EventListener <T> {
void onEvent(@javax.annotation.Nullable T t, @javax.annotation.Nullable com.google.cloud.firestore.FirestoreException e);
}
Вот код раздела Java
(см. https://firebase.google.com/docs/firestore/query-data/listen)
DocumentReference docRef = db.collection("cities").document("SF");
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot snapshot,
@Nullable FirestoreException e) {
if (e != null) {
System.err.println("Listen failed: " + e);
return;
}
if (snapshot != null && snapshot.exists()) {
System.out.println("Current data: " + snapshot.getData());
} else {
System.out.print("Current data: null");
}
}
});
Вот мой преобразованный код в Clojure
(defn outlook-synced-listenning
[^DocumentReference ref]
(let []
(-> ref
(.addSnapshotListener
(reify EventListener
(^void onEvent [this ^DocumentSnapshot snapshot ^FirestoreException e]
(if-not (nil? e)
(println " Listen failed: " + e)
)
(if (and (not (nil? snapshot)) (.exists snapshot))
(println " Current data: " + (.getData snapshot))
(println " Current data null ")
)
)))
)
))
Вот ошибка
Caused by: java.lang.IllegalArgumentException: Can't find matching method: onEvent, leave off hints for auto match.
at clojure.lang.Compiler$NewInstanceMethod.parse(Compiler.java:8305)
at clojure.lang.Compiler$NewInstanceExpr.build(Compiler.java:7853)
at clojure.lang.Compiler$NewInstanceExpr$ReifyParser.parse(Compiler.java:7754)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6919)
Я думаю, что ошибка с типами параметров и подсказками типов, когда код Clojure не совпадает с интерфейсом Java.
Полагаю, что я до сих пор неправильно конвертирую приведенную ниже строку кода в Clojure
docRef.addSnapshotListener (новый EventListener ()
Пожалуйста, посоветуйте мне, как я это делаю. Спасибо