Re: [Py4j-users] Interface troubles
Status: Beta
Brought to you by:
barthe
From: Barthelemy D. <ba...@cs...> - 2011-03-16 19:27:27
|
Hi Alec, Thanks for reporting this bug and for the test case, it was very helpful! I just pushed a fix to the git repository and I added your test case in the unit test suite. Don't hesitate to post again if you find another bug! Barthélémy On 03/16/2011 02:20 PM, Alec Chapman wrote: > Hi, > I've just started trying out py4j and am finding it really helpful so far. I > was able to implement a simple Java interface in Python, but I'm running into > trouble with more complicated interfaces. > > Specifically, I'm having trouble when one interface has a function that returns > another interface, with both interfaces implemented in Python. The problem > seems to be that the python object is only treated as a Java interface when it > is passed as an argument, not when it is the return value. > > I've included a simple example below. Is what I'm trying to do possible? > Thanks for any help, > Alec > > Here's the python code: > -------------------------------------------------- > > from py4j.java_gateway import JavaGateway > > class A(object): > class Java: > implements = ['py4j.examples.InterfaceA'] > > class B(object): > def foo(self): > return A() #this doesn't work > return gateway.jvm.py4j.examples.ClassA() #this does > class Java: > implements = ['py4j.examples.InterfaceB'] > > gateway = JavaGateway(start_callback_server=True) > gateway.entry_point.test(B()) > > And here's the Java code: > -------------------------------------------- > > public interface InterfaceA { > } > > public interface InterfaceB { > public InterfaceA foo(); > } > > public class ClassA implements InterfaceA{ > } > > public class InterfaceExample { > > public void test(InterfaceB b) { > InterfaceA a = b.foo(); > } > > public static void main(String[] args) { > GatewayServer server = new GatewayServer(new InterfaceExample()); > server.start(); > } > } > > ------------------------------------- > The error occurs in the line 'return A()': > > py4j.protocol.Py4JJavaError: An error occurred while calling t.test. > : py4j.Py4JException: An exception was raised by the Python Proxy. > at py4j.Protocol.getReturnValue(Protocol.java:393) > at py4j.reflection.PythonProxyHandler.invoke(PythonProxyHandler.java:100) > at $Proxy0.foo(Unknown Source) > at py4j.examples.InterfaceExample.test(InterfaceExample.java:8) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:119) > at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:392) > at py4j.Gateway.invoke(Gateway.java:255) > at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:124) > at py4j.commands.CallCommand.execute(CallCommand.java:81) > at py4j.GatewayConnection.run(GatewayConnection.java:175) > at java.lang.Thread.run(Thread.java:662) > > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > _______________________________________________ > Py4j-users mailing list > Py4...@li... > https://lists.sourceforge.net/lists/listinfo/py4j-users |