2009-06-19 3 views
9

He intentado pasar una lista de inicialización {...} a un constructor y no funcionó. Cuando lo declare en una variable local de método (int []) funcionó sin problemas.¿Por qué pasar {a, b, c} a un método no funciona?

¿Por qué es eso?

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}); 
    } 
} 
+0

Como sucede, lo que se convirtió en las características del lenguaje varargs (como java.util.Arrays.asList) originalmente iba a hacer precisamente eso. Probablemente fue un error cambiarlo ... –

Respuesta

20

Al declarar int[] y asignar {1, 2, 3}, el compilador sabe que desea crear un int[] tal como está explicado allí mismo.

En este último caso en el que se pega la matriz directamente en el método de llamada que tenga que utilizar

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1}); 

para decirle al compilador de lo que es su matriz.

+0

Ya veo. Gracias. –

-1

¿Ha intentado colar la lista a int [] antes de pasarlo al constructor?

+0

Sí, (int []) {1,2,3} no funcionó. –

4

Esto es probablemente debido a que su lista de inicialización no tiene información de tipeo. Pruebe esto:

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1}); 
2

Java realmente no tiene inferencia tipo. Las declaraciones de variables de matriz son special case en la especificación del lenguaje Java, una que no se aplica a los parámetros del método. Hacerlo sería posible, pero agregaría mucha complejidad a la especificación, ya que tendría que manejar preguntas como si {"a", "b"} crea una Cadena [] o un Objeto [] - parece obvio aquí, pero, ¿y si se trata de objetos en una jerarquía de tipos complejos? ¿Y qué pasa si el método está sobrecargado y existen ambas versiones?

4

También se puede hacer así:

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); 
    } 
} 
+0

¡Muy bonito! Voy a usar esto. –

10

La construcción {} se llama un inicializador de matriz, y se utiliza para inicializar un array en Java. (Referencia: Section 10.6: Array Initializers de The Java Language Specification, Third Edition.)

La razón por la que pasa {1, 2, 3} sí no es válida se debe a que no hay información de tipo asociado con el inicializador.

Por lo tanto, uno debe dejar que el compilador sepa el tipo de matriz al escribir new Type[], donde Type es el tipo para el que está hecha la matriz.

Los siguientes son todo uso válido de la inicializador array:

  • new String[] {"Hello, "World"}
  • new Character[] {'A', 'B'}
  • new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}

Como puede verse, esta notación se puede utilizar para muchos tipos de datos , así que no es algo específico para enteros.

cuanto a:

int[] a = {1, 2, 3}; 

La razón por la cual lo anterior es válido, porque es el tipo de información se proporciona al compilador en la declaración de tipo variable, que en este caso es int[]. Lo anterior da a entender es la siguiente:

int[] a = new int[] {1, 2, 3}; 

Ahora, si tenemos new int[] {1, 2, 3}, somos capaces de crear una nueva int[] matriz en su lugar, por lo que se pueden manejar como cualquier otro int[] gama haría - es sólo que no tiene un nombre de variable asociado.

Por lo tanto, la matriz creada por new int[] {1, 2, 3} puede ser enviado en un método o constructor que toma un int[] como su argumento:

new Quicksort(new int[] {1, 2, 3}); // This will work. 
0

llaves (cuando se utiliza en literales de matriz) sólo puede utilizarse cuando se declara la array :)

Cuestiones relacionadas