groovy
  1. groovy
  2. GROOVY-5272

Intermittant/random incorrect resolution of sub-interface constant values

    Details

    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.8.5
    • Fix Version/s: 1.8.6, 2.0-beta-3
    • Component/s: groovy-jdk
    • Labels:
      None
    • Environment:
      Windows XP and LINUX
    • Testcase included:
      yes
    • Number of attachments :
      0

      Description

      If a constant in a sub-interface replaces/shadows a constant in a super interface (both Java), when trying to access the sub-interface's constant value from Groovy, the behaviour is intermittantly incorrect - sometimes the sub-interface's value is returned (correct) and sometimes the super interface's value is returned (incorrect).
      In Java the sub-interface's value is always returned, as expected.

      See source code below that demonstrates this: InterfaceA.java, InterfaceB.java, ShowBugGroovy.groovy, ShowBugJava.java
      If ShowBugGroovy is repeatedly run, sometimes the assertion fails, sometimes it passes (randomly?). I believe the behaviour is the same for concrete implementations of the sub-interface.

      package groovybug;
      
      public interface InterfaceA {
          String FOO="Foo A";
      }
      
      package groovybug;
      
      public interface InterfaceB extends InterfaceA {
          String FOO="Foo B";
      }
      
      package groovybug
      
      class ShowBugGroovy {
          static main(args) {
              println("Interface A: " + InterfaceA.FOO);
              println("Interface B: " + InterfaceB.FOO);
      
              // Fails randomly
              assert(InterfaceA.FOO!=InterfaceB.FOO)
          }
      }
      
      package groovybug;
      
      public class ShowBugJava {
          public static void main(String[] args) {
              System.out.println("Interface A: " + InterfaceA.FOO);
              System.out.println("Interface B: " + InterfaceB.FOO);
      
              // Always passes
              assert(!InterfaceA.FOO.equals(InterfaceB.FOO));
          }
      }
      

        Issue Links

          Activity

            People

            • Assignee:
              CÚdric Champeau
              Reporter:
              Stephen Summerfield
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: