AbstractList etc. functionality as interfaces with default methods?

Brian Goetz brian.goetz at oracle.com
Thu May 14 14:04:03 UTC 2015


The static-instance asymmetry cancels that one out.  If you have

class Foo {
    void m(int x) 
    static void m(Foo f, int x) 
}

Then Foo::x could either be an unbound mref to the instance method or a static mref.  Even with a perfect target type (Foo, int) -> void, compiler will still report ambiguity.  

On May 14, 2015, at 9:52 AM, Vitaly Davidovich <vitalyd at gmail.com> wrote:

> Ambiguous in isolation, but within context they're quite different: one
> takes an arg and the other is void.
> 
> sent from my phone
> On May 14, 2015 9:25 AM, "Remi Forax" <forax at univ-mlv.fr> wrote:
> 
>> 
>> 
>> On 05/14/2015 03:05 PM, Brian Goetz wrote:
>> 
>>> Not only is there a problem with modCount, but also with
>>>>> equals/hashCode/toString.  You can’t define these Object methods in an
>>>>> interface.
>>>>> 
>>>> They could be defined as static methods to delegate to. From API
>>>> consistency perspective, we have for example the following static methods
>>>> on primitive wrapper classes:
>>>> 
>>> Right.  We considered this during Lambda, but by the time we got here, we
>>> concluded that this was mostly trading one downside for another.  It seemed
>>> overwhelmingly likely that people would forget to override
>>> equals/hashCode/toString in this case, and create collections that violated
>>> the contract.
>>> 
>>> 
>> The other problem is that it creates ambiguous method references,
>> if you have a class or an interface like:
>> class A {
>>  public static int hashCode(A a) { ... }
>> }
>> 
>> A::hashCode is ambiguous.
>> 
>> cheers,
>> Rémi
>> 
>> 




More information about the core-libs-dev mailing list