Change in javac handling of anonymous/local classes

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Feb 27 14:18:38 PST 2013


On 27/02/13 22:05, Alex Buckley wrote:
> On 2/27/2013 1:40 PM, Maurizio Cimadamore wrote:
>> On 27/02/13 21:16, Alex Buckley wrote:
>>> - I suspect javac 1.6 and 1.7 choose TT.f3(String) because of a
>>> different belief about shadowing. Maurizio, please comment on what's
>>> visible at 'f3(0);'.
>> Javac implements the so called comb-lookup [1] - supertypes are looked
>> up before enclosing types. The problem with f1 is a glitch that has been
>> fixed in JDK 8.
>>
>> Afaik the comb rule is also supported in Eclipse. I don't think there's
>> any compiler out there that think the anonymous class has two f3 
>> members.
>>
>> [1] -
>> https://blogs.oracle.com/jrose/entry/scope_ambiguities_between_outer_and
>
> First, I didn't say the anonymous class declaration has two f3 
> members. Obviously it has one f3 member, inherited from TT. What I 
> said is that two f3 method declarations are _visible_ from the body of 
> the anonymous class declaration, at least according to JLS 6.4.1.
>
> Second, the comb rule is operational in nature, and has never been 
> stated explicitly in the JLS. It should emerge from a combination of 
> class membership and inheritance (8.2, 8.4.8), scope (6.3), shadowing 
> (6.4.1), and the meaning of method names (6.5.7.1). I don't think it 
> does emerge, though perhaps I am misinterpreting shadowing in 6.4.1. 
> It's clear that compilers think X1.f3 in the enclosing scope is 
> shadowed by the inherited TT.f3. (Even though no-one actually _likes_ 
> the comb rule.)
>
> Alex
I think the fun happens in 15.12.2 (class or interface to search):

If it is a simple name, that is, just an/Identifier/, then the name of 
the method is the/Identifier/. If the/Identifier/appears within the 
scope(§6.3) 
<http://docs.oracle.com/javase/specs/jls/se5.0/html/names.html#103228>of 
a visible method declaration with that name, then there must be an 
enclosing type declaration of which that method is a member. Let/T/be 
the innermost such type declaration. The class or interface to search is/T/.


What is the innermost type declaration where the call to f3 occurs? I'd 
say that T is the type of the anonymous inner class. Then T is the type 
to search and anything after that will take membership into account. As 
you stated, X1.f3 is not a member, so it is ignored.

It follows that members in X1 are only considered when there's no 
matching method in T (the innermost type) so that the search must fall 
back to the enclosing type. Hence the comb.

Maurizio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20130227/067a0c90/attachment.html 


More information about the compiler-dev mailing list