Hi guys, Attached is a test version of Inline::Java 0.52_99 that tries to address the above-mentionned issues. Basically, if the class of an object returned by a method is not public and is not in the unnamed package, Inline::Java will assing the return type of the method as the object type instead of the "real" object type.
I did a few tests and this seems to fix some of the specific JBDC-type errors without breaking anything in the test suite. The only file modified (with respect to these issues) is InlineJavaProtocol.java, see the new AutoCast method. If anyone has a chance to try it out on real world problems that would be great. Note: There are also some minor bug fixes in there that were in my sandbox, it's minor stuff that shouldn't affect general functionnality. Thanks a lot, Patrick On Fri, Oct 2, 2009 at 10:58 AM, Jason Stelzer <men...@neverlight.com>wrote: > On Fri, Oct 2, 2009 at 10:11 AM, Patrick LeBoutillier > <patrick.leboutill...@gmail.com> wrote: > > Choosing to always give objects the return types of the methods that > > returned them would break a lot of things, > > and would actually introduce more casting (i.e. anytime you would work > with > > generic containers, like Vectors, you > > would always need to cast (just like in Java basically)). That in my > opinion > > would remove some of the "magic"... > > Yeah, I can see that side of the issue too. Most of the stuff I've had > to work around has been stuff surrounding interfaces for similar but > slightly different reasons. For instance, when dealing with EJB, you > have the same kind of problems. You look up a resource in jndi, you > get back a portable remote object (the primorial object type for ejb) > and have to narrow the cast based on an interface. When you get right > down to it, its corba roots show pretty clearly. So, I did what seemed > best. I encapsulated all that casting in a perl object facade for the > ejb and presented a more perlish interface to calling code. Keep java > looking like java, perl looking like perl and glue code as out of the > way as possible :) > > The JDBC thing is kind of a different issue. For JDBC, there's a very > clear distinction. JDBC is all about interface, not implementation. > Initially I was thinking that it would be as simple as adding a little > extra meta info about classes. Using reflection, you can pretty easily > see what the return types of any given methods are. The issue, as you > correctly point out, is that when you're dealing with concrete > implementation classes, you can't really derive if a person is calling > them from the context of an interface, or in the context of a plain > old object reference. In some cases it would just result in a bunch of > wasteful casts. > > > > And because all overridden Java methods are virtual, meaning you can't > > really call the wrong method when it's overridden > > (unlike C++ I think), in reality this only seems to be a problem in these > > specific circumstances: non-public classes that implement public > interfaces > > or extend public base classes. > > > > Agreed. And there are other ways to work around the issue outside of > Inline::Java. What we're running into issues with are a vendors > implementation of the interfaces. > > I'm happy to give it a shot. Send me a patch, git url, svn url, or a > tarball. I can test it out with mysql, oracle and probably a couple > other databases if I force myself to make the time. > > I'm glad for the discussion, I'll see if I can come up with some > patches for JDBC.pm that'll let it be a little more strong handed > about forcing the interface casts. > > -- > J. > -- ===================== Patrick LeBoutillier Rosemère, Québec, Canada