Syntax for calling super

Paul Benedict pbenedict at apache.org
Thu Aug 23 06:27:03 PDT 2012


I think David is onto something good and worthy of attention.

super.K.m() is much more natural. It reads correctly whether tracing
the notation forward or backward:

Forward: "Your superclass K having method m"
Backward: "Method m of class K of your superclass"

Paul

On Wed, Aug 22, 2012 at 8:01 PM, David Holmes <david.holmes at oracle.com> wrote:
> On 23/08/2012 8:13 AM, Brian Goetz wrote:
>>
>> The syntax was designed to be analogous to the "K.this.m()" syntax that
>> is used in inner classes.
>
>
> But the semantics are quite different. K.this is a reference to a
> completely different object (the enclosing instance from class K). Whereas
> as K.super is meant to infer something about 'this'.
>
> If anything I think super.K.m() is more natural as an extension to the
> existing super.m() notation.
>
> David
> -----
>
>
>> One problem with the syntax you suggest is that unlike "this", "super"
>> is not a valid expression.
>>
>> This would be made worse by the inconsistency it would introduce over
>> "this"; currently ((K) this) has a meaning, and the role of casting to
>> an enclosing (K) in that meaning would not be consistent with your
>> suggestion for ((K) super).
>>
>> That said, we're not married to the K.super.m() syntax if there is an
>> obviously better one.  On the other hand, we don't dislike the
>> K.super.m() syntax either.
>>
>>
>> On 8/22/2012 5:41 PM, Paul Benedict wrote:
>>>
>>> This syntax caught my eye:
>>>
>>> interface K {
>>>     int m() default { return 88; }
>>> }
>>>
>>> interface J extends K {
>>>     int m() default { return K.super.m(); }
>>> }
>>>
>>> I really don't think it is is appropriate to code "K.super.m()". An
>>> natural English reading of "K.super" would be "superclass of K" since
>>> it is K that is qualified.... but that's not what the code intends to
>>> be.
>>>
>>> I would recommend a casting syntax to make the intention clearer:
>>> interface J extends K {
>>>     int m() default { return ((K) super).m(); }
>>> }
>>>
>>> Paul
>>>
>>
>


More information about the lambda-dev mailing list