groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "John Wagenleitner (JIRA)" <j...@apache.org>
Subject [jira] [Closed] (GROOVY-7158) minus(List, Collection) considers different objects equal if they have equal hashCodes
Date Mon, 17 Jul 2017 19:11:00 GMT

     [ https://issues.apache.org/jira/browse/GROOVY-7158?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

John Wagenleitner closed GROOVY-7158.
-------------------------------------
    Resolution: Fixed
      Assignee: John Wagenleitner

This issue was fixed by the fix for GROOVY-7530 and the [code in question|https://github.com/apache/groovy/blob/6a8232a5ba4fdf89c7c3d1eddba68b909f4a732a/src/main/org/codehaus/groovy/runtime/NumberAwareComparator.java#L53]
now compares using {{equals}}.


> minus(List, Collection) considers different objects equal if they have equal hashCodes
> --------------------------------------------------------------------------------------
>
>                 Key: GROOVY-7158
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7158
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-jdk
>            Reporter: motto
>            Assignee: John Wagenleitner
>
> This is essentially a duplicate of GROOVY-4101 and the related ticket GROOVY-4124.
> In [org.codehaus.groovy.runtime.DefaultGroovyMethods.minus(Collection<T> self,
Collection<?> removeMe)|https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/DefaultGroovyMethods.java#L10048]
> {noformat}
> Comparator<T> numberComparator = new NumberAwareComparator<T>();
> ...
> if (numberComparator.compare(element, (T)elt) == 0) {
>   iter.remove();
>   elementRemoved = true;
> }
> {noformat}
> objects not implementing [Comparable|http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html]
and without a compareTo method are compared using the [NumberAwareComparator|https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/NumberAwareComparator.java#L37]
> {noformat}
>  // since the object does not have a valid compareTo method
> // we compare using the hashcodes. null cases are handled by
> // DefaultTypeTransformation.compareTo
> int x1 = o1.hashCode();
> int x2 = o2.hashCode();
> if (x1 == x2) return 0;
> if (x1 < x2) return -1;
> return 1;
> {noformat}
> which incorrectly removes unequal objects from the original collection.
> This is exceedingly frustrating because the results are therefore sporadic and supposedly
resolved according to GROOVY-4101 and GROOVY-4124. After a fair amount of head scratching
and debugging (on more than 1 occasion) I went looking at the sources on github and it appears
the patch has never made it into master. Is it possible the patch was deemed unfit? Was it
forgotten about? Is this something I should fix myself?



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Mime
View raw message