Different behavior between (F) and (Object & F)

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Nov 8 08:29:55 PST 2012


Ah right - this gives IllegalAccessErro... this has been on the todo 
list for a while; I think I will take a stab at it since I'm at it.

Thanks
Maurizio


On 08/11/12 15:17, bitter_fox wrote:
> F#clone was provided default implementation.
> My case is:
>
> interface F
> {
>     default Object clone() {}
>
>     void m();
> }
>
> F f = () -> {};
>
> And it now passes compiler and it makes:
>
> class $$lambda$n implements F
> {
>     public void m()
>     {
>         Enclosing.lambdan();
>     }
>
>     // override protected Object clone()
> }
>
> I think () -> {} shouldn't pass compiler
>
> Regards,
> bitter_fox
>
> 2012/11/9 Maurizio Cimadamore <maurizio.cimadamore at oracle.com 
> <mailto:maurizio.cimadamore at oracle.com>>
>
>     Forget my previous email - I know realize what your email is about
>     - should this code work?
>
>     interface F {
>         Object clone();
>     }
>
>     F f = ()->null;
>
>     I think it should - the metafactory will ggenerate a _public_
>     implementation for the clone method - i.e.
>
>     class $$$lambdaClass$$$ implements F {
>         public Object clone() {
>             return null;
>         }
>     }
>
>     Which is legal...
>
>     Maurizio
>
>     On 08/11/12 14:49, Maurizio Cimadamore wrote:
>
>         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