implementation inconsistency with scope rules for Java generic types
Rémi Forax
forax at univ-mlv.fr
Thu Jun 19 04:57:19 PDT 2008
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