implementation inconsistency with scope rules for Java generic types

Alex Buckley Alex.Buckley at Sun.COM
Fri Jun 20 14:09:42 PDT 2008


Yes, JLS 8.1.6 defines the class body as the content strictly within the 
{ ... } of the class declaration.

Alex

Rémi Forax wrote:
> Maurizio Cimadamore a écrit :
>> Hi Nick,
>> this is definitively an interesting question; if your example might 
>> look like a straight javac bug at first, it' less clear whether it 
>> should be considered as such when Subclass and NestedSubclass live in 
>> completely unrelated packages; I think that one in principle could 
>> exploit an eventual vulnerability (as the one you described for 
>> Eclipse) for acquiring access to members of a private type that 
>> otherwise cannot be accessed.
>>
>> In this particular case however, since the class referencing the 
>> private type is the class in which that type is defined, I don't think 
>> that an error should be raised - so this is indeed a javac bug.
>>
>> Alex do you have any JLS paragraph handy to support this?
> In section 6.6.1, the  next to last bullet  says:
> "if the member or constructor is declared |private|, then access is 
> permitted if and only if it occurs within the body of the top level 
> class (§7.6) 
> <http://java.sun.com/docs/books/jls/third_edition/html/packages.html#26783> 
> that encloses the declaration of the member or constructor"
> 
> If body means body like in the grammar;
> 
> /NormalClassDeclaration:
> /|     class|/ Identifier [/TypeParameters]/ [/|extends|/ Type] 
> [/|implements|/ TypeList] ClassBody/
> 
> 
> Annotations or extends/implements types are not in the body so javac is 
> correct.
>> Maurizio
> Rémi
>>
>> Nick Radov wrote:
>>>
>>> I've run across an interesting inconsistency between javac and the 
>>> Java compiler built in to the Eclipse 3.3.2 IDE. Try compiling this 
>>> piece of code.
>>>
>>> public class X<T> {
>>> }
>>> class Subclass extends X<Subclass.NestedSubclass> {
>>> @SuppressWarnings("unchecked")
>>> private final class NestedSubclass extends X {
>>> }
>>> }
>>>
>>> The javac compiler reports one error because the generic type 
>>> parameter of the Subclass class has private access, but Eclipse 
>>> reports no errors. I had reported this as an Eclipse bug, but one of 
>>> the Eclipse team thinks it may be a javac bug. You can see the 
>>> Eclipse bug report here: 
>>> <https://bugs.eclipse.org/bugs/show_bug.cgi?id=237656>.
>>>
>>> Does anyone know for sure which is correct? As far as I can tell the 
>>> JLS doesn't explicitly state whether this is allowed, although it may 
>>> be implicit in the scope rules.
>>>
>>> *Nick Radov | Director, Research & Development | Axolotl Corp*
>>> www.axolotl.com <http://www.axolotl.com/>, d: 408.920.0800 x116, f: 
>>> 408.920.0880
>>> 160 West Santa Clara St., Suite 1000, San Jose, CA, 95113
>>>
>>> THE MARKET LEADER IN HEALTH INFORMATION EXCHANGE – PROVIDING PATIENT 
>>> INFORMATION WHEN AND WHERE IT IS NEEDED.
>>>
>>> /The information contained in this e-mail transmission may contain 
>>> confidential information. It is intended for the use of the 
>>> addressee. If you are not the intended recipient, any disclosure, 
>>> copying, or distribution of this information is strictly prohibited. 
>>> If you receive this message in error, please inform the sender 
>>> immediately and remove any record of this message./ 
> 



More information about the compiler-dev mailing list