Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-7954

Equal Operator for Classes implementing Comparable not Working on Interfaces

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.4.7
    • Fix Version/s: 3.0.0-beta-1, 2.5.7
    • Component/s: groovy-runtime
    • Labels:
      None
    • Environment:
      Windows 10, Java 7

      Description

      Using the equal operator "==" on two instances A and B does not work correctly, when

      1) A and B implement the same interface I1 but are not the same class and
      2) interface I1 extends the "Comparable" interface.

      The checking in DefaultTypeTransformation.compareToWithEqualityCheck(...) checks for assignable classes, and uses compareTo when assignable on class level (which is not the case for instance A and B). But it does not check on interface level.

      That way, calling the compareTo(..) method is not performed.
      In my use case, class A and B are actually considered equal, even so their concrete implementation is different. And the compareTo(...) method would actually return 0.

      How about doing real equality checking instead of returning -1 close to the end of method DefaultTypeTransformation.compareToWithEqualityCheck(...):

      ...
      if (equalityCheckOnly) {
      return left.equals(right) ? 0 : -1;
      }

      throw new GroovyRuntimeException("Cannot compare " + left.getClass().getName() + " with value '" +
      left + "' and " + right.getClass().getName() + " with value '" + right + "'");

      Thanks for your effort.

        Attachments

        1. Example.zip
          2 kB
          Josef

          Issue Links

            Activity

              People

              • Assignee:
                paulk Paul King
                Reporter:
                jhasenbe Josef
              • Votes:
                2 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:

                  Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 1.5h
                  1.5h