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

Equal Operator for Classes implementing Comparable not Working on Interfaces

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.4.7
    • 3.0.0-beta-1, 2.5.7
    • groovy-runtime
    • None
    • 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

              paulk Paul King
              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