2010-12-06 5 views
2

J'ai l'itérateur personnalisé suivant:casting types génériques en Java

Je cette classe:

class Dog extends Pet 

Mais le compilateur Java ne permettra pas à cette distribution (iterate retourne un PetIterator) :

Iterator<Dog> dogs = (Iterator<Dog>)petstore.iterate (“dogs”); 

Comment puis-je récupérer mes Golden Retrievers, autre que l'écriture :

PetIterator dogs = petstore.iterate (“dogs”); 
... 
Dog dog = (Dog)dogs.next(); 
+2

Pouvez-vous s'il vous plaît donner le type de retour de petstore.iterate (String)? – imyousuf

+0

Merci, j'ai mis à jour ma question –

Répondre

4

Vous pouvez réécrire votre méthode iterate(String) à ceci:

class PetStore { 
    <T extends Pet> PetIterator<T> iterate(Class<T> clazz); 
} 

Ensuite, vous pouvez utiliser ce type en toute sécurité méthode

PetIterator<Dog> dogs = petstore.iterate (Dog.class); 
// ... 
Dog dog = dogs.next(); 
3

Parce que PetIterator<T extends Pet> n'est pas un PetIterator<Dog>. Il peut être n'importe quel Pet, puis votre iterator.next() ne pourra pas être converti en Dog.

Pourquoi ne pas utiliser simplement class PetIterator implements Iterator<T> (qui est la même T est celui de l'objet petstore, que je suppose est aussi générique)