Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.1.2
Description
We have this Java class:
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:
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:
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[]
".
Maybe that is expected behaviour though.
Attachments
Issue Links
- is duplicated by
-
GROOVY-10099 A single null argument to a varargs parameter is received as null
- Closed
- is related to
-
GROOVY-1026 Null argument to methods with vararg parameters are replaced with array of length 1
- Closed
- relates to
-
GROOVY-10722 AIC via array-based (variadic) constructor null and array arguments
- Closed