Default method survey results

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Fri Aug 17 02:12:11 PDT 2012


On 16/08/12 21:42, David Holmes wrote:
> On 16/08/2012 11:33 PM, Maurizio Cimadamore wrote:
>> You are reading my words too strictly. What I'm saying is that there
>> already is a place where you have to specify a keyword where the
>> compiler could obviously infer one for you. And yet, I haven't seen that
>> many discussions as to why compiler requires you to write:
>>
>> class Foo {
>> _abstract_ foo();
>> }
>>
>> isn't that obvious? There's no body!!! Should we change the
>> compiler/language? I don't think so - for the same reasons as I think we
>> should keep 'default'.
>
> This is a hollow argument. In 1995 the then language designers made a 
> decision about how to express abstract classes and methods and the 
> world was gradually introduced to that over the next few years. Some 
> people undoubtedly thought the syntax was too verbose, but on the 
> other hand defining explicitly abstract classes and methods was 
> something relatively new to OO programmers. There was no community 
> then to discuss the issues.
>
> Jump forward to 2012 and we have a vibrant community and when people 
> are presented with new language proposals they get to evaluate them 
> and express their views. One such view held by a number (myself 
> included) is that the default keyword is simply superfluous. Arguing 
> that default belongs because we already another superfluous keyword is 
> just unsound reasoning. Two wrongs don't make a right.
I think you misread what I've said. In my view it's not 'two wrongs', as 
I don't think 'abstract' should be removed. So, for me it's more like 
'two rights make a right' ;-)
>
> None of the other "arguments" carry any weight with me either. The 
> whole notion of default-ness is context dependent. You can't look at 
> an interface declaration and know whether a method implementation will 
> be an actual default for anything - you have to see the entire type 
> hierarchy for that.
>
>> I think default != concrete - at least under some interpretations of it.
>> In the example I gave, you have a concrete method that does not override
>> an abstract method in the superclass, because superclass methods always
>> win, even if abstract. This is what, in my mind at least, makes a
>> default method a different beast.
>
> This part almost slipped past me! Your example:
>
> interface A {
>     void m() default { ... }
> }
>
> class B {
>     abstract void m();
> }
>
> class C extends B implements A { } //m is abstract in C
>
> On the surface this seems surprising and wrong to me. I thought a 
> superclass _implementation_ of a method always wins and an abstract 
> method has no implementation. That said I can see we may be getting 
> into a corner where the resolution story is difficult to express in a 
> simple way yet still give all the desired results (in this case I view 
> the desired result as the interface default taking precedence over the 
> superclass abstract method). Re-abstraction at the class or interface 
> level certainly complicates things (but is necessary).
I think the above summarises pretty well why we need a different 
keyword, and why the meaning can sometimes be a bit more subtle than 
just 'concrete'.
>
> But actually won't the above be a compilation error because class C 
> would need to be declared abstract? That would at least alter the 
> developer that this may not be working the way they might have 
> expected and they can explicitly delegate to A.m().
Yeah - that would be a compile-time error because C is not abstract - at 
which point one could ask - why is this not working? I have a 'concrete' 
method in A, why the compiler is not picking that up? As you said, the 
notion of 'default-ness' is context dependent (more precisely, it's the 
notion 'defaultness-becomes-concreteness' which is context-dependent), 
while the notion of 'concrete-ness' is not. That feels like an important 
distinction.

Maurizio
>
> Thanks,
> David
>
>
>> Maurizio
>>>
>>> Moreover, non abstract method in interface change the way the VM
>>> populates the class vtable by using code of method declared in 
>>> interfaces,
>>> so the semantics you're talking about, the semantics that change, is 
>>> the
>>> semantics of 'implements',
>>> not the semantics of the non-abstract method by itself. (cf Stephen
>>> Colebourne reply)
>>>
>>>> What are the motivations behind leaving the 'default' keyword out? 
>>>> Note:
>>>> it must be more than just avoiding to type 'd' 'e' 'f' 'a' 'u' 'l' 
>>>> 't' -
>>>> which, as you say, probably somebody else would have typed in for 
>>>> you ;-)
>>>>
>>>> Maurizio
>>> Rémi
>>>
>>>
>>>
>>
>>



More information about the lambda-dev mailing list