2010-03-14 6 views
13

Dans .NET, le tableau et la liste ont Enumerable comme ancêtre, donc une méthode qui accepte Enumerable en tant qu'argument peut recevoir à la fois array et list comme argument. Je me demande s'il y a une chose similaire dans Java?Ancre commune à Java Tableau et liste

Répondre

20

Non, il n'y a pas d'équivalent en Java. Je suggère généralement que vous concevez des méthodes API pour recevoir List<T>, Collection<T> ou Iterable<T>. Tandis que ceux-ci excluent directement en appelant la méthode avec un tableau, vous pouvez envelopper un tableau très facilement en utilisant Arrays.asList. Cela est plus flexible pour l'appelant que de spécifier un tableau en tant que paramètre de méthode, ce qui force une implémentation unique. Je suis d'accord que ce n'est pas idéal cependant.

Notez que dans .NET, les tableaux unidimensionnels n'implémentent pas seulement IEnumerable<T> - ils implémentent également IList<T>.

1

Les deux dérivent de java.lang.Object. Cependant, ce n'est pas lié à la collection, ce que je pense est ce que vous cherchez.

3

Array et List en Java ne partagent pas un ancêtre commun autre que java.lang.Object.

Les deux peuvent être consultées en utilisant la boucle foreach, comme ceci:

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

Obtenir mes langues confus - été en train de lire C# récemment. – duffymo

4

Ils ne disposent pas d'un ancêtre commun, cependant, il existe des méthodes pour jeter entre les deux types selon les besoins -

Alors vous pourriez fournir une surcharge méthode de moulage en un type commun - c.-à-d.

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

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

Fondamentalement, les tableaux ont un type implicite qui est une sous-classe d'objet. Voir Arrays dans le 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 

Les listes et les tableaux sont traités est ainsi pas non plus la même chose quand on considère covariance/contravariance.

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

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

Cela devient encore pire si l'on considère les génériques, mais c'est un autre sujet. Dans l'ensemble, je ne connais pas la raison d'être de cette conception, mais nous devons vivre avec.

1

Iterable<T> est l'équivalent Java de IEnumerable<T>. Toutes/la plupart des collections implémentent cette interface (y compris ArrayList et les tableaux), donc oui. Mais ce n'est pas un "ancêtre" (ce n'est pas non plus dans .NET), mais une interface commune.