Por que passar {a, b, c} a um método não funciona?
-
06-07-2019 - |
Pergunta
Eu tentei passar uma lista de inicialização {...} para um construtor e não funcionou. Quando eu em vez declarou-lo em uma variável local do método (int []) ele funcionou perfeitamente.
Por que isso?
public class QuickSort {
int[] a;
public QuickSort(int[] a) {
this.a = a;
}
public static void main(String[] args) {
// ###################
// ### WORKS ##
// ###################
int[] a = {8,12,79,12,50,44,8,0,7,289,1};
QuickSort sort = new QuickSort(a);
// ###################
// ### DOESN'T WORK ##
// ###################
//QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
}
}
Solução
Ao declarar uma int[]
e atribuindo {1, 2, 3}
o compilador sabe que você deseja criar um int[]
como é explicitada logo ali.
Neste último caso, onde você furar a matriz diretamente para a chamada de método, você teria que usar
QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
para dizer ao compilador que sua matriz é.
Outras dicas
A construção {}
é chamado um inicializador de array, e ele é usado para inicializar uma matriz em Java. (Referência: Artigo 10.6: Initializers matriz de The Java Language Specification, terceira edição .)
A razão pela qual passando {1, 2, 3}
si não é válido é porque não há informações sobre o tipo associado com o inicializador.
Por isso, deve-se deixar que o compilador sabe o tipo da matriz é escrevendo new Type[]
, onde o Type
é o tipo para o qual a matriz é feita para.
A seguir estão todos uso válido da matriz initializer:
-
new String[] {"Hello, "World"}
-
new Character[] {'A', 'B'}
-
new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}
Como pode ser visto, esta notação pode ser usado para muitos tipos de dados, por isso não é algo que é específico para inteiros.
Quanto:
int[] a = {1, 2, 3};
A razão pela qual o acima é válido porque o tipo de informação é fornecido para o compilador na declaração do tipo variável, que neste caso é int[]
. O que acima está implicando é o seguinte:
int[] a = new int[] {1, 2, 3};
Agora, se temos new int[] {1, 2, 3}
, somos capazes de criar uma nova matriz int[]
no lugar, de modo que pode ser tratada como qualquer outra matriz int[]
faria - é só que ele não tem um nome de variável associada a ele.
Portanto, a matriz criado por new int[] {1, 2, 3}
podem ser enviados em um método ou construtor que leva um int[]
como seu argumento:
new Quicksort(new int[] {1, 2, 3}); // This will work.
Este é provavelmente porque a sua lista de inicialização não tem nenhuma informação escrita para ele. Tente isto:
QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
Você também pode fazer assim:
public class QuickSort {
int[] a;
public QuickSort(int ... a) {
this.a = a;
}
public static void main(String[] args) {
QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
}
}
Java não tem realmente a inferência de tipos. declarações de variáveis ??de matriz são um caso especial em a especificação da linguagem Java, que não se aplica aos parâmetros do método. Fazer isso seria possível, mas gostaria de acrescentar um monte de complexidade para a especificação, uma vez que teria de lidar com questões como se { "a", "b"} cria uma String [] ou um Object [] - parece óbvio aqui, mas o que se é objetos em uma hierarquia de tipo complexo? E se o método está sobrecarregado e existem duas versões?
chaves (quando usado em literais de matriz) só pode ser usado quando a matriz declarando:)
Você já tentou lançar a lista para int [] antes de passá-lo para o construtor?