Syntax for calling super

GREGG WONDERLY greggwon at gmail.com
Fri Aug 24 10:03:41 PDT 2012


On Aug 23, 2012, at 8:00 PM, David Holmes <david.holmes at oracle.com> wrote:

> On 24/08/2012 12:56 AM, Peter Levart wrote:
>> On Thursday, August 23, 2012 11:01:46 AM David Holmes 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'.
>> 
>> Intuitively I don't have problems with K.super. I see K.something as something
>> qualified with type K.
>> 
>> In case of "this" it selects the innermost instance of type K, whereas in case
>> of "super" it selects the most specific visible member from the
>> superclass/superinterface K's hierarchy.
>> 
>> In both cases K is an addidional restriction to the "search strategy".
> 
> K.super.m() already has an existing meaning with inner classes, just as 
> K.this.m() does. There's a difference between searching for a type alone 
> and searching for an object and then a type. Using the same notation is 
> confusing in my view.

This view is troubling to me.  If we are in an inner class, and code

OuterName.this.m();

The compiler knows to look for the type OuterName in the hierarchy of class definitions visible to the inner class, and then invoke m().

For default methods, if a we write

OuterName.this.m();

It seems to me that even though the compiler has to look in a slightly different way, the fully qualified name of OuterName is visible to it, so that it can ask "Is this a class" or "Is this an interface", and the take the appropriate steps to resolve what to invoke.

Having the compiler do this small amount of introspection of the class/interface name space, seems like a lot better choice, then asking the developer to remember to type this vs super.

What will be the compiler error message, if I type this instead of super or vice versa?  What will that do to help the developer really code effectively?

Gregg


More information about the lambda-dev mailing list