From: Samuele P. <ped...@op...> - 2008-07-31 23:02:26
|
this is just a quick answer so is a bit rough. >> >>>>> b1 = Boolean.TRUE >>>>> b1 >>>>> >> 1 >> shouldn't this be True ? > Integer -> int > String -> str > Boolean -> bool > ... > otherwise-> javainstance > > Where javainstance is a thin wrapper for "generic" objects. So this > means that any java method returning a `Boolean` gets it's result > transformed to a python's `bool`. > > Now the cause. The transformation described above is _not_ done for > constructors. Constructor "return values" (i.e. `this`) is directly > mapped to `javainstance`: > > >>>> type(Boolean(1)) >>>> > <type 'javainstance'> > >>>> type(Boolean.TRUE) >>>> > <type 'bool'> > >>>> type(Integer(1)) >>>> > <type 'javainstance'> > >>>> type(String("foo")) >>>> > <type 'javainstance'> > > Bottom line: Jython gives special treatment to Boolean() constructor > (and Integer(), Short(), String(), ...) > This allows to construct and carry around such objects in jython code, such that things like Object.getClass(Boolean(1)) would behave as in jJva. In some sense it increases slightly the amount of java manipulations that can be done from the Jython side, I think I used this property in my own code at times. This was based also - I think - on the assumption that at least people with a Java background would expect/not be surprised by constructors being special. > With enough bad luck, the lookup will start by the the foo(int, int), > and it will be successful, because PyBoolean still can be coerced to > Integer if asked (it's just not the "default" conversion now). I don't > think we can do anything here, `bool` in python is a subclass of > `int`, thus the behavior is sound. > This is a complicated issue. First of all Jython will try not the signatures in any order, it tries to sort them first. It tries to use though a total ordering independent from the actual argument types. This is not really possible though in general and the sorting is subtly broken. My prototyping in sandbox/new_disp (I think nothing happend to it yet) was trying to attack that bug, the dir contains also a crasher that shows the sorting problem. The kind of approach used in new_disp is also more general that what Jython does currently, in particular in its context it would it possible to make it so that True would prefer java overloaded signatures with boolean and 1 would do the reverse. I don't know/remember why not more has happend with it, I think Frank looked into it at some point quite a while ago as checkin dates show. regards |