2014-01-15 3 views
7

Я могу только найти материал об обратном; используя 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 во время компиляции.

+2

Как я предполагаю, я попытался бы определить 'I ' и используя 'T' каждый раз где. –

+0

Другой способ избежать использования Object везде - написать интерфейс Java, который отражает фактический тип и возвращаемые типы, которые вы ожидаете от реализации, и использовать 'extend-protocol', чтобы позволить экземплярам вашего интерфейса Java удовлетворять протоколу. – Alex

ответ

2

Как уже сказал Исаак, да.

Однако, без представления источника, я думаю, что это своего рода требование о лошадях * t. Пожалуйста, обратите внимание: я не имею в виду ответ Исаака, когда я это говорю. Я имею в виду то, как Clojure работает в этом случае.

Если вам нужен Java-интерфейс, вы можете захотеть придерживаться скучных интерфейсов Java. Я думаю, что это также облегчило бы взаимодействие с другими языками в JVM, так как это наименее общий знаменатель. Я также думаю, что это облегчает общение с разработчиками не Clojure.

7

Да, вполне возможно, и так далее.

Из соответствующей части docs:

defprotocol будет автоматически генерировать соответствующий интерфейс, с тем же именем, что и протокол, т.е. дал my.ns протокол/протокол, интерфейс my.ns. Протокол. Интерфейс будет иметь методы, соответствующие функциям протокола, и протокол будет автоматически работать с экземплярами интерфейса.

И, чтобы ответить на ваш вопрос:

Java, клиент ищет для участия в протоколе, могут сделать это наиболее эффективно за счет реализации интерфейса протокола сгенерированные.

+0

Где я могу найти сгенерированный файл класса или исходный файл Java интерфейса? – rightfold

+0

@rightfold Вам нужно будет AOT-компилировать пространство имен, которое определяет протокол, чтобы сгенерировать файл .class. См. Http://clojure.org/compilation – Alex

+0

Вероятно, единственный способ эффективно использовать сгенерированный класс - это какой-то класс, сгенерированный IDE, который его реализует. – Bill

Смежные вопросы