Syntax for calling super

"Zdeněk Troníček" tronicek at fit.cvut.cz
Wed Aug 22 22:46:58 PDT 2012


In addition, K.super already means something else:

class A {
    int x;
}

class B extends A {
    int x;
    class B1 {
        int x;
        {
            System.out.println(B.super.x); // refers to A.x
            System.out.println(B.super.toString()); // calls A.toString()
        }
    }
}

What about K.default?

Z.
-- 
Zdenek Tronicek
FIT CTU in Prague


David Holmes napsal(a):
> 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