Different behavior between (F) and (Object & F)
bitter_fox
bitterfoxc at gmail.com
Thu Nov 8 16:19:28 PST 2012
Thank you for your fix.
Regards,
bitter_fox
2012/11/9 Maurizio Cimadamore <maurizio.cimadamore at oracle.com>
> On 08/11/12 16:29, Maurizio Cimadamore wrote:
>
>> 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.
>>
> Fixed now - the compiler now applies the same check in both cases.
>
> Maurizio
>
>> 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<maurizio.cimadamore at oracle.com>
>>> <mailto:maurizio.cimadamore@**oracle.com<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