varargs eo argumento '...'
-
11-09-2019 - |
Pergunta
Considere a declaração de método:
String.format(String, Object ...)
O argumento Object ...
é apenas uma referência a uma matriz de Object
s. Existe uma maneira de usar este método com uma referência a uma matriz Object
real Se eu passar em uma matriz Object
ao argumento ...
-? Será o valor do argumento resultante ser uma matriz bidimensional - porque um Object[]
é em si uma Object
:
Object[] params = ....; // Make the array (for example based on user-input)
String s = String.format("%S has %.2f euros", params);
Assim, o primeiro componente da matriz (que é usado no método String.format
), será um array e ele irá gerar:
[class.getName() + "@" + Integer.toHexString(hashCode())]
e, em seguida, um erro porque o tamanho da matriz é 1.
O negrito seqüência é a verdadeira questão.
Esta é uma segunda pergunta:? Faz uma matriz ...
/ parâmetro tem um nome
Solução
A partir dos docs sobre varargs :
Os três períodos após a final Tipo de parâmetro indicam que o argumento final pode ser transmitido como um ou matriz como uma sequência de argumentos.
Assim, você pode passar múltiplos argumentos ou um array.
A seguir funciona muito bem:
class VarargTest {
public static void main(String[] args) {
Object[] params = {"x", 1.2345f};
String s = String.format("%s is %.2f", params);
System.out.println(s); // Output is: x is 1.23
}
}
Outras dicas
Você pode simplesmente passar um array:
public void foo(String... args) {
}
String args[] = new String[10];
foo(args);
A situação que você está descrevendo vai ser bastante raro: a maior parte do tempo, seus varargs itens serão String
s ou números, ou Widget
s ... será incomum para eles ser Object
s (que poderia ser qualquer coisa) ou matrizes.
Mas se o argumento varargs é um monte de Object
s ou um tipo de matriz, em seguida, a sua pergunta surge: você pode passá-lo uma única matriz e, em seguida, como é que o compilador saber se você quis passar um array (aquele que você forneceu), ou um conjunto de 1 artigo que deve colocar em uma matriz para você?
A mostra de testes rápidos a resposta:
public class TestClass {
public static void main(String[] args) {
Object anObject = new Object();
Object[] anArray = new Object[] {anObject, anObject};
System.out.println("object1 = " + anObject);
System.out.println("array1 = " + anArray);
takesArgs();
takesArgs(anObject, anObject);
takesArgs(anArray); // is this the same as array1?
takesArgs(anArray, anArray);
}
public static void takesArgs(Object... stuff) {
System.out.println("The array was " + stuff);
}
}
O resultado da execução (os números exatos irão variar:
object1 = java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1
Portanto, a resposta é que, em casos ambíguos que trata o que você passado como a matriz em vez de criar uma nova matriz para envolvê-lo. Isso faz sentido, como você poderia sempre envolvê-lo em uma matriz si mesmo se você queria a outra interpretação.