Hi Eric, Thanks for your help.. I've created an bug for this https://bugs.eclipse.org/bugs/show_bug.cgi?id=253109
Thanks, Fernando On Sun, Nov 2, 2008 at 3:41 PM, Eric Bodden <[EMAIL PROTECTED]>wrote: > Thanks for the clarification. To me this seems like a bug in the sense > that it is certainly a violation of the "principle of least > astonishment" ;-) > > If I was you I would open a bug report, even if it's just for the sake > for clarifying (non?)existing documentation. > > Eric > > 2008/11/2 Fernando Rubbo <[EMAIL PROTECTED]>: > > Hi Eric, > > > > first of all, thanks for your fast response. > > Please, see the comments inline > > > >> *However* no List<Y> is ever subtype of a List<X> for any two > >> different concrete types X and Y, regardless of whether Y is a subtype > >> of X! As a consequence, also List<Integer> cannot possibly be an > >> ArrayList<Number>. > > > > For Java I 100% agree with you. > > For AspectJ what I've seen so far for args(..) and after(..) > returning(..) > > constructions is that it does not follow the Java subtyping for generic > > types. Actually it would be a lot easer to understand if they had used > the > > same behavior, but... > > Note that the same issue happens also for <? extends Number>. > > > >> What surprises me is the fact that the first advice in BC matches. > >> Actually this should not match either, I believe, because also a > >> List<Integer> can never be a List<Number>. I am not sure... could this > >> have to do with type erasure? > > > > If args(..) constructions followed the Java subtyping, again, I would > agree > > 100% with you. > > But according to some experiments I did, unfortunately it does not work > at > > the same way (may be a bug, I don't know). > > > > About the erasure.. > > In the byte code on the signature attribute, the Java compiler stores the > > generic information. So it is possible to the AspectJ compiler to check > the > > right generic type to match. > > // Method descriptor #15 (Ljava/util/List;)V > > // Signature: (Ljava/util/List<Ljava/lang/Integer;>;)V > > // Stack: 4, Locals: 3 > > void m(java.util.List arg0); > > > > For me it seems to be understandable why they have decided to implement > the > > args(..) stuff in that way (although I don't like it). If the method m > > receives a List of integers in the Java code, it will cause no runtime > error > > (after type erasure) into the advice when an integer be assign to number > > variable. but, what does not make sense for me is: When AspectJ uses a > > runtime test to check if it is an ArrayList the matching is totally > > different. I've shown only one example, but there are others cases where > it > > change the behavior because of the runtime test. Does not make sense. > > > > I need to understand if this design were planned by the AspectJ developer > or > > if it is a bug. If it were planned, what is the correct semantics for > this? > > how args(..) should work? Shouldn't be better (and a lot easer) if it > > followed the same Java subtyping? > > > > Thanks a lot, > > Fernando Rubbo > > > >> > >> > >> Eric > >> > >> 2008/11/1 Fernando Rubbo <[EMAIL PROTECTED]>: > >> > Hi all, > >> > > >> > I have a question about args(..) and after(..) returning(..) > >> > construction > >> > semantics when generic types are applied. > >> > Actually, it is not clear for me how it is working and why it is > working > >> > this way. Let me show an example to help to depict my thoughts. > >> > > >> > class C{ > >> > void m(List<Integer> e){} > >> > } > >> > > >> > aspect AC { > >> > void around():execution(* C.*(..)) && args(List<Integer>) {} // > >> > Matchs > >> > C.m > >> > void around():execution(* C.*(..)) && args(ArrayList<Integer>) {} > // > >> > Unchecked match C.m - uses rRuntime check > >> > } > >> > > >> > In this simple example, it is easy to notice that both advices will > >> > match > >> > the method C.m. Note that the second one will make a runtime test to > >> > check > >> > if the method caller has passed, as a parameter, an ArrayList object. > >> > Since > >> > actual type parameters are erasured during compile-time, the AspectJ > >> > compiler just warn the programmer that this is an unchecked match > >> > (however, > >> > it is easy to notice that in this case it will never cause a > >> > ClassCastException during runtime). > >> > > >> > To show my question, take a look on the below aspect: > >> > > >> > aspect BC { > >> > void around():execution(* C.*(..)) && args(List<Number>) {} // > >> > Matchs > >> > C.m > >> > void around():execution(* C.*(..)) && args(ArrayList<Number>) {} > // > >> > DOES > >> > NOT MATCH C.m > >> > } > >> > > >> > This is exactly the same aspect I've shown before, just changing type > >> > parameter from Integer to Number in both args(..) constructions. > >> > Note that in BC aspect, the first advice follows the same semantics > than > >> > the > >> > AC one, and then, matches the method C.m. However, the second advice > >> > DOES > >> > NOT follow the same semantics (that the AC one), and then, DOES NOT > >> > MATCH > >> > C.m AT ALL. > >> > > >> > My question is: > >> > Should not the second advice of BC aspect match the method C.m and use > a > >> > runtime check to verify if the given parameter is an ArrayList? Some > one > >> > can > >> > explain to me why the second advice is not matching the method C.m? > >> > > >> > The same problem is found in the following using the <? extends > Number> > >> > aspect CC { > >> > void around():execution(* C.*(..)) && args(List<? extends Number>) > >> > {} > >> > // Matchs C.m > >> > void around():execution(* C.*(..)) && args(ArrayList<? extends > >> > Number>) > >> > {} // DOES NOT MATCH C.m > >> > } > >> > > >> > > >> > There exists a formal description saying how args(..) and after(..) > >> > returning (..) must works? > >> > > >> > > >> > Thanks in advance > >> > Fernando Rubbo > >> > > >> > _______________________________________________ > >> > aspectj-users mailing list > >> > aspectj-users@eclipse.org > >> > https://dev.eclipse.org/mailman/listinfo/aspectj-users > >> > > >> > > >> > >> > >> > >> -- > >> Eric Bodden > >> Sable Research Group, McGill University, Montréal, Canada > >> Got an interesting job offer? http://www.bodden.de/hire-me/ > >> _______________________________________________ > >> aspectj-users mailing list > >> aspectj-users@eclipse.org > >> https://dev.eclipse.org/mailman/listinfo/aspectj-users > > > > > > _______________________________________________ > > aspectj-users mailing list > > aspectj-users@eclipse.org > > https://dev.eclipse.org/mailman/listinfo/aspectj-users > > > > > > > > -- > Eric Bodden > Sable Research Group, McGill University, Montréal, Canada > Got an interesting job offer? http://www.bodden.de/hire-me/ > _______________________________________________ > aspectj-users mailing list > aspectj-users@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users >
_______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users