2010-11-08 5 views
4

J'implémente l'interface List dans une classe qui stocke des données dans un tableau de type <T>. Cela soulève des problèmes avec les méthodes qui prennent Collection en tant que paramètres, puisque la collection stocke ses objets sous Object. Comment puis-je transformer Object en T? La coulée simple ne fonctionne pas.Coulée d'objets à <T> -type

class MyCollection<T> implements List<T>{ 
    T[] tab; 

    MyCollection() { 
     this.tab = (T[])new Object[10]; 
    } 

    public boolean addAll(Collection c){ 
     for(Object o : c){ 
      o = (T)o; 
      for(int i = 0; i < tab.length; i++){ 
       tab[i] = o; 
      } 
     } 
    } 

} 

Je suis en train:

public boolean addAll(Collection<? extends T> c) 

mais il échoue avec:

public boolean retainAll(Collection<?> c) depuis que je ne peux pas changer le type de collection ici:/

public boolean retainAll(Collection<?> c){ 
    boolean result = false; 
    for(T t : c){ 
    } 
    return result; 
} 
+0

Comment vous implémentez 'retainAll (Coll ...)'? –

+0

édité avec l'implémentation – mastodon

Répondre

1

Est-il la bonne approche?

Oui, c'est la bonne approche. C'est ce que l'interface est définie comme (sauf que l'interface utilise E, mais cela n'a pas d'importance). Notez que votre addAll doit renvoyer un boolean. En outre, vous n'avez pas besoin de lancer addAll que vous avez implémenté. Changez votre boucle au lieu:

for(T o : c){...} 

Et votre retainAll devrait être bien aussi, aussi longtemps que vous retournez un boolean.

EDIT:

Pour votre mise en œuvre retainAll, il ne devrait pas être nécessaire de parcourir la passé dans Collection<?> et à un casting T. Pensez à itérer sur votre tableau de support tab et voir si chaque instance est contenue dans le Collection<?> c passé. Si, pour une raison ou une autre, vous devez impérativement utiliser les éléments c comme T s, vous pouvez les diffuser.

+0

dans retainAll Je reçois des types incompatibles. Obligatoire T, trouvé java.lang.Object ' – mastodon

1

Vous devriez être en train de définir votre méthode de addAll comme ceci:

public boolean addAll(Collection<? extends T> c) {...} 

Voilà comment ça est défini dans l'API Java

+0

Et si retainAll vous donne des problèmes, vous devez remplacer le tout conserver à prendre Collection ainsi. Les autres suggestions fonctionnent, mais celle-ci est "plus correcte" selon moi. –

1

L'association à T n'est pas nécessaire de mettre en œuvre retainAll(...). Par exemple:

public boolean retainAll(Collection<?> c){ 
    boolean result = false; 
    Iterator<T> it = this.iterator(); 
    while (it.hasNext()) { 
     T t : it.next(); 
     if (!c.contains(t)) { 
      it.remove(); 
      result = true; 
     } 
    } 
    return result; 
}