Тестовый пример, чтобы проиллюстрировать это:
Код Java с объявлением метода приема vararg (который оказывается статическим):
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;
}
}
Этот код Java (тестовый пример JUnit4) вызывает вышеизложенное (мы используем тестовый пример, чтобы ничего не тестировать, а просто для генерации некоторого вывода):
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"}));
}
}
Выполнение этого как теста JUnit дает:
sendNothing (): полученный 'x' - это массив размером 0
sendNullWithNoCast (): полученный 'x' равен нулю
sendNullWithCastToString (): полученный 'x' - это массив размером 1
sendNullWithCastToArray (): полученный 'x' равен нулю
sendOneValue (): полученный 'x' - это массив размером 1
sendThreeValues (): полученный 'x' - это массив размером 3
sendArray (): полученный 'x' - это массив размером 3
Чтобы сделать это более интересным, давайте вызовем receive()
функцию из Groovy 2.1.2 и посмотрим, что произойдет. Оказывается, результаты разные! Хотя это может быть ошибкой.
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"
}
}
Выполнение этого как теста JUnit дает следующее, с отличием от Java, выделенным жирным шрифтом.
sendNothing (): полученный 'x' - это массив размером 0
sendNullWithNoCast (): полученный 'x' равен нулю
sendNullWithCastToString (): полученный 'x' равен нулю
sendNullWithCastToArray (): полученный 'x' равен нулю
sendOneValue (): полученный 'x' - это массив размером 1
sendThreeValues (): полученный 'x' - это массив размером 3
sendArray (): полученный 'x' - это массив размером 3
asList
метод в образце и его цель.