Jython: есть ли чистый способ реализации интерфейсов Java с помощью ссылок на функции? - PullRequest
4 голосов
/ 24 марта 2010

Я знаю, что могу реализовать интерфейс Java с Jython следующим образом:

class MyListener (Listener): 
  def foo(self, event):
    print(str(event))

Python имеет первоклассные функции, поэтому это кажется излишним - особенно для интерфейсов с одним методом. Есть ли способ просто передать лямбда или функцию, которая реализует один метод в интерфейсе вместо этого?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Начиная с Jython 2.5.2 (бета-версия 2), функции Jython работают как реализации Java-интерфейсов с одним методом. От http://www.zyasoft.com/pythoneering/2010/09/jython-2.5.2-beta-2-is-released/:

Функции Python могут быть напрямую переданы в методы Java, которые принимают интерфейс одного метода (например, Callable или Runnable). Это означает, что теперь вы можете передать функцию обратного вызова, обычно замыкание, вместо этого поместив ее в класс, реализующий этот интерфейс. Тобиас Иварссон реализовал эту функцию.

1 голос
/ 27 июля 2010

Согласно онлайн-примерам, это возможно для интерфейса AWT / Swing Event. Просто создайте замыкание с правильными аргументами, передайте его, а Jython должен сделать все остальное. К сожалению, мне не удалось воспроизвести это поведение для самопровозглашенных интерфейсов, поскольку я всегда получаю исключение «TypeError: arg не может быть принудительно приведен».

Мне тоже очень хотелось бы знать, возможно ли это, и если да, то, что я делаю неправильно.

...