2010-03-14 16 views
13

En .NET, tanto la matriz como la lista tienen Enumerable como antecesor, por lo que un método que acepte Enumerable como argumento puede recibir tanto la matriz como la lista como su argumento. Me pregunto si hay algo similar en Java?Ancestro común para Java Array y List

Respuesta

20

No, no hay ningún equivalente en Java. En general, le sugiero que diseñe métodos API para recibir List<T>, Collection<T> o Iterable<T>. Si bien estos excluyen directamente llamando al método con una matriz, puede envolver una matriz muy fácilmente usando Arrays.asList. Esto es más flexible para la persona que llama que la especificación de una matriz como parámetro de método, lo que obliga a una implementación única.

Estoy de acuerdo en que no es ideal.

Tenga en cuenta que en .NET, las matrices unidimensionales no solo implementan IEnumerable<T> sino que también implementan IList<T>.

1

Ambos derivan de java.lang.Object. Sin embargo, esto no está relacionado con la recopilación, que creo que es lo que estás buscando.

3

La matriz y la lista en Java no comparten un ancestro común que no sea java.lang.Object.

Tanto se puede acceder mediante el bucle foreach, así:

String [] array = new String [] { "foo", "bar", "baz", }; 
List<String> list = Arrays.asList("x", "y", "z"); 

for (String s : array) 
    System.out.println(s); 

for (String s : list) 
    System.out.println(s); 
+1

Haciendo que mis idiomas se confundan - he estado leyendo C# últimamente. – duffymo

4

No tienen un ancestro común, sin embargo, hay métodos para emitidos entre los dos tipos según su necesidad -

por lo que podría proporcionar un sobrecargado método para convertir a un tipo común - es decir,

public void doAll(MyType[] array) { 
    doAll(Arrays.asList(array)); 
} 

public void doAll(List<MyType> list) { 
    //... process List here. 
} 
2

Básicamente, las matrices tienen un tipo implícito que es una subclase de objeto. Ver Arrays en el JLS:

public static void main(String[] args) { 
      int[] ia = new int[3]; 
      System.out.println(ia.getClass()); 
      System.out.println(ia.getClass().getSuperclass()); 
    } 

    > class [I 
    > class java.lang.Object 

La manera matrices y listas también se manejan no es lo mismo cuando consideramos covariance/contravariance.

List<Object> l = new ArrayList<String>(); // complain 
Object[] l2 = new String[1]; // ok 

l2[0] = 4; // throw ArrayStoreException. 

Se pone aún peor si tenemos en cuenta los genéricos, pero ese es otro tema. En general, no conozco la razón de ser de este diseño, pero tenemos que vivir con eso.

1

Iterable<T> es el equivalente de Java de IEnumerable<T>. Todas/la mayoría de las colecciones implementan esta interfaz (incluidas ArrayList y matrices), así que sí. Pero no es un "antecesor" (que tampoco está en .NET), sino una interfaz común.