[
https://issues.apache.org/jira/browse/GROOVY-6146?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles updated GROOVY-6146:
--------------------------------
Labels: varargs (was: )
> Calling a Java vararg method from Groovy with a null argument cast to the
> vararg type behaves differently than in Java
> ----------------------------------------------------------------------------------------------------------------------
>
> Key: GROOVY-6146
> URL: https://issues.apache.org/jira/browse/GROOVY-6146
> Project: Groovy
> Issue Type: Bug
> Components: groovy-runtime
> Affects Versions: 2.1.2
> Environment: Fedora Release 17
> Reporter: David Tonhofer
> Priority: Major
> Labels: varargs
>
> We have this Java class:
> {code:title=JavaReceiver.java|borderStyle=solid}
> 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;
> }
> }
> {code}
> which is called from this Java class to verify various effect:
> {code:title=JavaSender.java|borderStyle=solid}
> 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"}));
> }
> }
> {code}
> 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:
> {code:title=GroovySender.groovy|borderStyle=solid}
> 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"
> }
> }
> {code}
> 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.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)