Acces to private field from nested class when the type of reference is a generic type variable with upper bound of outer class
maurizio cimadamore
maurizio.cimadamore at oracle.com
Fri Oct 7 12:43:59 PDT 2011
Yep - that's intentional - it's listed in the compatibility notes of the
JDK 7 release [1].
In general accessing private members of a type-variable is not sound
(note that O could be instantiate by a subclass of Outer in which the
field would not be accessible).
[1] -
http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
Maurizio
On 07/10/2011 20:29, Peter Levart wrote:
> This code compiles with latest JDK 6 javac:
>
> package test;
>
> public class Outer
> {
> private int outerField;
>
> public Outer(int outerField)
> {
> this.outerField = outerField;
> }
>
> public static class Inner<O extends Outer>
> {
> public int getOuterField(O outer)
> {
> return outer.outerField;
> }
> }
>
> public static void main(String[] args)
> {
> Outer outer = new Outer(12);
> Inner<Outer> inner = new Inner<Outer>();
> System.out.println(inner.getOuterField(outer));
> }
> }
>
>
> ... but refuses to compile with JDK 7 javac (release or latest 7u2-b08 prerelease), giving the
> following compilation failure:
>
> src/test/Outer.java:16: error: outerField has private access in Outer
> return outer.outerField;
> ^
>
> even if tried with -source 1.6 -target 1.6 options.
>
> Is this intentional or a bug?
>
>
> Regards, Peter
More information about the compiler-dev
mailing list