Acces to private field from nested class when the type of reference is a generic type variable with upper bound of outer class
Peter Levart
peter.levart at gmail.com
Fri Oct 7 13:45:38 PDT 2011
On Friday, October 07, 2011 10:13:10 PM David M. Lloyd wrote:
> But the field _would_ be accessible according to JLS §6.6.1 regardless
> of whether the object was of a subtype. It seems pretty clear to me,
> but maybe I'm just being dense?
It's not the type of object that matters, but the type of variable.
For example:
public class A {
private int x = 1;
void m() {
B b = new B();
System.out.println(b.x); // no go
A a = b;
System.out.println(a.x); // prints 1
}
}
public class B extends A {
private int x = 2;
}
... you see, the same object, but different types of variables A vs. B!
The same goes for types that are expressed as type-variables. They are a conjunction of all
possible types that match the bounds (if any). The language is sound if it does not "prefer"
just one of them.
Peter
>
> On 10/07/2011 02:43 PM, maurizio cimadamore wrote:
> > 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#s
> > ource
> >
> >
> > 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