195 votes

Pourquoi un tableau n'est pas assignable à Iterable ?

Java5 nous pouvons écrire :

ou simplement en utilisant un Iterable dans la boucle for. Ceci est très pratique.

Toutefois, vous ne peut pas écrire une méthode générique pour itérable comme ceci :

et de l’appeler avec un tableau car il n’est pas un Iterable :

Je m’interroge sur les raisons de cette décision de conception.

80voto

Tom Hawtin - tackline Points 82671

Comme msaeed commentaires, les tableaux peuvent mettre en œuvre des interfaces (Cloneable et java.io.Serializable). Alors pourquoi ne pas l' Iterable? Je suppose Iterable des forces de l'ajout d'un iterator méthode, et les tableaux de ne pas mettre en œuvre des méthodes. char[] n'a même pas de remplacer toString. De toute façon, les tableaux de références doivent être considérés comme des moins que l'idéal - utiliser Lists. Comme dfa commentaires, Arrays.asList faire la conversion pour vous, de manière explicite.

(Cela dit, vous pouvez appeler clone sur les tableaux.)

62voto

Gareth Adamson Points 407

Le tableau est un objet, mais ses éléments pourraient ne pas être. Le tableau détiendraient un type primitif comme int, qui Iterable ne peut pas faire face. Au moins c’est ce que je pense.

20voto

Daniel Earwicker Points 63298

Les tableaux doivent appuyer Iterable,, ils ne sont pas, pour la même raison que .NET tableaux ne prennent pas en charge une interface qui permet readonly d'accès aléatoire par la position (il n'y a pas une telle interface définie comme standard). Fondamentalement, les cadres ont souvent peu ennuyeux lacunes en eux, c'est pas la peine quelqu'un est temps de corriger. Il n'a pas d'importance si nous pourrions fixer eux-mêmes dans certains de façon optimale, mais souvent nous ne le pouvons pas.

Mise à JOUR: Pour être équitable, je l'ai mentionné .NET des tableaux de ne pas soutenir une interface qui prend en charge l'accès aléatoire par poste (voir aussi mon commentaire). Mais, dans .NET 4.5 exacte de l'interface a été définie et est pris en charge par des réseaux et de l' List<T> classe:

IReadOnlyList<int> a = new[] {1, 2, 3, 4};
IReadOnlyList<int> b = new List<int> { 1, 2, 3, 4 };

Tout n'est pas encore tout à fait parfaite en raison de la mutable liste de l'interface IList<T> ne pas hériter IReadOnlyList<T>:

IList<int> c = new List<int> { 1, 2, 3, 4 };
IReadOnlyList<int> d = c; // error

Peut-être qu'il est possible de compatibilité descendante gotcha à un tel changement.

Si il n'y a aucun progrès sur des choses semblables dans les nouvelles versions de Java, je serais intéressé à savoir dans les commentaires! :)

15voto

jjnguy Points 62123

Malheureusement, les tableaux ne sont pas"class-assez". Ils n'implémentent pas l' Iterable interface.

Car un tableau n'est pas un objet dans le sens normal, il ne peut pas implémenter l'interface.

La raison pour laquelle vous pouvez les utiliser dans les boucles for-each est parce que le Soleil ajouté dans quelques syntatic sucre pour les tableaux (c'est un cas spécial).

Comme les tableaux a commencé comme " presque des objets avec Java 1, il serait beaucoup trop drastique d'un changement à faire d'eux de véritables objets en Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X