2012-07-22 1 views
1

J'ai une méthode dans une de mes classes utilitaires qui prend une collection et un objet de classe, et retourne une instance Iterable qui peut itérer sur tous les membres de la collection qui sont des instances de la classe spécifiée. Sa signature est:Comment puis-je convertir un type générique en type générique avec un paramètre générique?

public static <T> Iterable<T> iterable (
     Iterable<? super T> source, Class<T> requiredClass); 

Cela fonctionne très bien pour la plupart des cas d'utilisation, mais maintenant je dois l'utiliser avec une classe générique, Item<PROTOTYPE>. Je comprends que je ne peux pas être certain que les articles retournés par le iterator résultant ne peut être garantie pour avoir un prototype particulier, j'ai donc essayé de jeter son retour comme suit:

Iterable<Item<?>> allItems = (Iterable<Item<?>>) 
          TypeCheckingIterator.iterable(source, Item.class); 

Malheureusement cela renvoie une erreur de compilation « ne peut pas jeter Iterable<Item>-Iterable<Item<?>> "

Pourquoi ne peut-il effectuer cette fonte quand je peux me Item-Item<?> tout à fait heureux? Existe-t-il un moyen de forcer ce moulage, sans avoir à lancer explicitement les objets retournés par les itérateurs?

+0

Dupe: http://stackoverflow.com/q/10869467/774444 –

+0

@LouisWasserman qui souffre le exactement le même problème .. –

Répondre

2

Vous pouvez utiliser l'effacement de type si vous êtes sûr de sa sécurité

Iterable<Item<?>> allItems = (Iterable<Item<?>>) (Iterable) 
         TypeCheckingIterator.iterable(source, Item.class); 

ou

Iterable<Item<?>> allItems = 
        TypeCheckingIterator.<Item<?>>iterable(source, Item.class); 
+0

Je ne peux pas obtenir votre deuxième solution au travail. J'obtiens l'erreur: La méthode paramétrée > itérable (Iterable >, Classe >) de type TypeCheckingIterator ne s'applique pas aux arguments (Iterable , Classe ). Pas sûr que le problème est, PositionedObject est certainement une superclasse de l'article Jules

+0

Et en changeant les moulages dans la première solution à (Iterable >) (Iterable ) évite un avertissement de type brut. – Jules

+0

Ce n'est pas que tous les éléments sont égaux. Je voudrais essayer d'introduire le caractère générique '' car je ne vois pas comment cela vous aide. –

Questions connexes