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});
    }
}
Foi útil?

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?

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