Different behavior between (F) and (Object & F)
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Nov 8 06:49:21 PST 2012
On 08/11/12 14:40, bitter_fox wrote:
> In this case, the overridden method is F#clone and this is public, and
> the overriding method is Object#clone and this is not public. This
> would be compile-time error.
Strictly speaking this is all true. Javac (and other compilers too) has
a tendency to defer this kind of checks. For instance, even w/o lambdas,
it is possible to write code like:
class Foo<X extends Object & F> { }
Now, should this be illegal? The current view is that we let the
type-witness to provide a public overrider for Object's clone.
So the well-formedness check for intersection types has been
historically loose in this respect; right now, javac is re-using the
same well-formedness check regardless of whether the intersection type
appears as a type-variable bound or as a cast target; this seems
reasonable, however it leaves out few cases as you correctly point out.
It is very likely that some additional restrictions on intersection
types will come out when they are used as a target of a functional
expression.
Maurizio
More information about the lambda-dev
mailing list