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

Calling a Java vararg method from Groovy with a null argument cast to the vararg type behaves differently than in Java

    XMLWordPrintableJSON

Details

    Description

      We have this Java class:

      JavaReceiver.java
      public class JavaReceiver {
      
          public static String receive(String... x) {
              String res = ((x == null) ? "null" : ("an array of size " + x.length));
              return "received 'x' is " + res;
          }
      }
      

      which is called from this Java class to verify various effect:

      JavaSender.java
      import org.junit.Test;
      
      public class JavaSender {
      
          @Test
          public void sendNothing() {
              System.out.println("sendNothing(): " + JavaReceiver.receive());
          }
      
          @Test
          public void sendNullWithNoCast() {
              System.out.println("sendNullWithNoCast(): " + JavaReceiver.receive(null));
          }
      
          @Test
          public void sendNullWithCastToString() {
              System.out.println("sendNullWithCastToString(): " + JavaReceiver.receive((String)null));
          }
      
          @Test
          public void sendNullWithCastToArray() {
              System.out.println("sendNullWithCastToArray(): " + JavaReceiver.receive((String[])null));
          }
      
          @Test
          public void sendOneValue() {
              System.out.println("sendOneValue(): " + JavaReceiver.receive("a"));
          }
      
          @Test
          public void sendThreeValues() {
              System.out.println("sendThreeValues(): " + JavaReceiver.receive("a", "b", "c"));
          }
          
          @Test
          public void sendArray() {
              System.out.println("sendArray(): " + JavaReceiver.receive(new String[]{"a", "b", "c"}));
          }
      
      }
      

      Running the test above yields this output:

      sendNothing(): received 'x' is an array of size 0
      sendNullWithNoCast(): received 'x' is null
      sendNullWithCastToString(): received 'x' is an array of size 1
      sendNullWithCastToArray(): received 'x' is null
      sendOneValue(): received 'x' is an array of size 1
      sendThreeValues(): received 'x' is an array of size 3
      sendArray(): received 'x' is an array of size 3

      Using essentially similar code from Groovy:

      GroovySender.groovy
      import org.junit.Test
      
      class GroovySender {
      
          @Test
          void sendNothing() {
              System.out << "sendNothing(): " << JavaReceiver.receive() << "\n"
          }
      
          @Test
          void sendNullWithNoCast() {
              System.out << "sendNullWithNoCast(): " << JavaReceiver.receive(null) << "\n"
          }
      
          @Test
          void sendNullWithCastToString() {
              System.out << "sendNullWithCastToString(): " << JavaReceiver.receive((String)null) << "\n"
          }
      
          @Test
          void sendNullWithCastToArray() {
              System.out << "sendNullWithCastToArray(): " << JavaReceiver.receive((String[])null) << "\n"
          }
      
          @Test
          void sendOneValue() {
              System.out << "sendOneValue(): " + JavaReceiver.receive("a") << "\n"
          }
      
          @Test
          void sendThreeValues() {
              System.out << "sendThreeValues(): " + JavaReceiver.receive("a", "b", "c") << "\n"
          }
      
          @Test
          void sendArray() {
              System.out << "sendArray(): " + JavaReceiver.receive( ["a", "b", "c"] as String[] ) << "\n"
          }
      }
      

      Yields the different output:

      sendNothing(): received 'x' is an array of size 0
      sendNullWithNoCast(): received 'x' is null
      sendNullWithCastToString(): received 'x' is null
      sendNullWithCastToArray(): received 'x' is null
      sendOneValue(): received 'x' is an array of size 1
      sendThreeValues(): received 'x' is an array of size 3
      sendArray(): received 'x' is an array of size 3

      So the "cast to a String" does not result in a call with the argument
      "String[]

      {null}

      ".

      Maybe that is expected behaviour though.

      Attachments

        Issue Links

          Activity

            People

              emilles Eric Milles
              yatima David Tonhofer
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: