2010-06-08 2 views
1
private static void printIterable(Iterable iterable) { 

    // ERROR: "Type mismatch: cannot convert from element type Object to Iterable" 
    for (Iterable i : iterable) { 
     System.out.println(i); 
    } 

} 

Ce que le compilateur parle? C'est un Iterable, pas un objet.Quel est le problème avec cette méthode d'impression-itérable?

+0

Ne pas utiliser le type brut dans le nouveau code: http://stackoverflow.com/questions/2770321/what-is -a-raw-type-et-pourquoi-ne-devrions-nous-utilisons-le – polygenelubricants

Répondre

4

Vous essayez de faire quelque chose pour chaque Iterable à l'intérieur du iterable. Ce serait logique si iterable était un Iterable<? extends Iterable> (à savoir qu'il serait itérer sur d'autres encore Iterable objets). Mais comme vous n'avez pas spécifié d'argument de type pour l'argument, vous savez seulement qu'il va itérer sur un type d'objet (c'est-à-dire que le type de base Object est applicable).

Vous devriez essayer ceci:

for (Object o : iterable) { 
    System.out.println(o); 
} 

Interprétés à haute voix le lire comme "Pour chaque Objecto en iterable, impression o". Remplacer Object dans cette phrase avec Iterable devrait illustrer ce que le problème était.

+1

+1. C'est facile à comprendre si vous parlez à voix haute. Supposons que vous ayez 'Iterable shoppingCart'. Alors 'pour (Item o: shoppingCart) {total + = o.getPrice(); } 'Lit * pour chaque article « o » dans shoppingCart ajouter le prix de o au total * –

+0

@MarkPeters:. Merci, je compris que dans la réponse. –

3

Votre variable de boucle est pas de type Iterable. Il est censé avoir le type d'éléments de collection. Étant donné que le paramètre de type Iterable n'a pas d'argument de type générique, vos articles peuvent être itérées comme des instances d'objet:

for (Object o : iterable) { 
    System.out.println(o); 
} 
1

Vous itérez itérables. Donc le type de variable 'i' devrait être objet non Iterable. Si vous voulez avoir un type spécifique, utilisez Java Generics.

0

Comme d'autres l'ont dit, vous essayez de itérer sur itérateurs, qui n'a pas de sens du tout. Vous devez utiliser Iterable dans la boucle for, mais dans votre exemple. Mais une bien meilleure solution est

private static void printIterable(Iterable<String> iterable) { 

    // ERROR: "Type mismatch: cannot convert from element type Object to Iterable" 
    for (String i : iterable) { 
     System.out.println(i); 
    } 
} 

(chaîne de remplacement avec l'objet que vous voulez)

Questions connexes