Pergunta

Considere a declaração de método:

String.format(String, Object ...)

O argumento Object ... é apenas uma referência a uma matriz de Objects. 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

Foi útil?

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 Strings ou números, ou Widgets ... será incomum para eles ser Objects (que poderia ser qualquer coisa) ou matrizes.

Mas se o argumento varargs é um monte de Objects 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top