Я могу только найти материал об обратном; используя Clojure для реализации интерфейсов Java. Тем не менее, я хочу написать программу в Clojure и разрешить ее расширять с помощью Java. Например:Возможно ли, чтобы класс, написанный на Java, реализовал протокол, написанный на Clojure?
# P.clj
(defprotocol P
(f [a])
(g [a b]))
# I.java
public class I implements P {
public Object f(Object a) { … }
public Object g(Object a, Object b) { … }
}
Кроме того, как бы я указать типы параметров, так что я не должен использовать Object
везде?
Единственный вариант, который я сейчас вижу, это использовать точечную нотацию и полагаться на утиную печать, но я предпочитаю проверку времени реализации интерфейса на стороне Java во время компиляции.
Как я предполагаю, я попытался бы определить 'I' и используя 'T' каждый раз где. –
Другой способ избежать использования Object везде - написать интерфейс Java, который отражает фактический тип и возвращаемые типы, которые вы ожидаете от реализации, и использовать 'extend-protocol', чтобы позволить экземплярам вашего интерфейса Java удовлетворять протоколу. – Alex