equals and hashCode
Brian Goetz
brian.goetz at oracle.com
Tue Oct 30 06:12:57 PDT 2012
Yes, but not just equality; identity. Which is the real problem -- we're still coping with the consequences of having naively decided 17 years ago that all non-primitive values must have identity. (Work is going on in JVM-land to give us a better option.)
On Oct 30, 2012, at 8:03 AM, Aleksey Shipilev wrote:
> On 10/30/2012 03:42 PM, Ben Evans wrote:
>> On Tue, Oct 30, 2012 at 11:23 AM, Mark Thornton <mthornton at optrak.com> wrote:
>>> On 30/10/12 11:15, Aleksey Shipilev wrote:
>>>>
>>>> That means lambdas inherit the default implementations of
>>>> equals/hashCode? It is as saying "you can't rely on equals()/hashCode()
>>>> for lambdas, since you are not in control of those". Although one can
>>>> piggyback on the factual behavior of lambdas, and we would have to
>>>> explicitly say when the lambdas are considered to be equal (or not). I.e.:
>>>>
>>>> Mapper lam1 = (x) -> x + 1;
>>>> Mapper lam2 = (x) -> x + 1;
>>>>
>>>> What are the expectations for equality? If we just inherit the default
>>>> equals/hashCode, I would expect:
>>>>
>>>> assertEquals(lam1, lam1); // true
>>>> assertEquals(lam1, lam2); // false
>>>
>>> I think that in this case the implementation is permitted but not
>>> required to return true, i.e. lam1 == lam2 is possible but not guaranteed
>>
>> This is a terrible idea.
>>
>> Implementation-defined behaviour of something as fundamental as an
>> equality operation is going to help no-one.
>
> I would be happy with "lambda equality is not defined" clause somewhere
> in the spec. The easiest way to implement this is to just let lambdas
> inherit Object.hashCode()/equals(). Sticking with some particular
> contract on lambda equality seems to counterfeit (possible) introduction
> of function types.
>
> -Aleksey.
>
>
More information about the lambda-dev
mailing list