Partage
  • Partager sur Facebook
  • Partager sur Twitter

[QST] Généricité et retour de methode

Besoin d'un piqûre de rappel

Sujet résolu
    22 mai 2012 à 18:57:31

    Bonjour a tous,

    j'ai une methode qui sert a parcourir dans un certain ordre une structure arborescente.
    Cette methode est récursive et doit pouvoir retourner une liste de noeud.
    Ces noeud peuvent etre de Type Node ainsi que des object heritant de Node

    Voici ma methode:
    public <T extends Node> ArrayList<T> iterateByPostOrder(T node){
    
    	ArrayList<T> listOfNode=new ArrayList<T>();
    	Hashtable<Position,Node> children=getChild(node);
    	Node leftNode=children.get(Position.LEFT);
    	Node rightNode=children.get(Position.RIGHT);
    	
    	if(leftNode!=null)
    		listOfNode.addAll((Collection<? extends T>) iterateByPostOrder(leftNode));
    	
    	if(rightNode!=null)
    		listOfNode.addAll((Collection<? extends T>) iterateByPostOrder(rightNode));
    	
    	listOfNode.add(node);
    
    	return listOfNode;
    }
    


    Dans l'état actuelle des choses, elle fonctionne mais je ne trouve pas comment (ni pourquoi) supprimer le cast (Collection<? extends T>).

    Pourriez vous me faire une piqûre de rappel et me dire comment faire pour virée ce cast barbare :D

    Merci a tous pour votre aide ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Le jour où Microsoft fera des choses qui ne plantent pas, ça sera des clous ...
      22 mai 2012 à 19:37:41

      Heu déjà, je saisis pas bien pourquoi tu écris
      public <T extends Node> ArrayList<T> iterateByPostOrder(T node)
      


      Pourquoi pas simplement écrire:

      public ArrayList<Node> iterateByPostOrder(Node node)
      


      Si c'est bien une liste de noeuds... J'ai peut-être tort et peut-être que c'est insuffisant dans ton contexte mais ça a le mérite de faire sauter le cast.
      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2012 à 21:04:52

        Non je suis bien obligé de garder le <T extends Node>
        • Partager sur Facebook
        • Partager sur Twitter
        Le jour où Microsoft fera des choses qui ne plantent pas, ça sera des clous ...
          23 mai 2012 à 10:47:53

          J'ai une classe qui fait quelque chose de similaire et je rajoute le "<T extends Node>" (enfin l'équivalent chez moi) ça crée ton problème. Si ta classe défini directement le type
          public abstract class AbstractContent<T extends Node>{
            	
           public ArrayList<T> iterateByPostOrder(T node)
          
           }
          }
          


          Tu as la sécurité que T extends de Node.

          Si tu ne peux pas faire autrement corrige déjà ce point :
          listOfNode.addAll((Collection<? extends T>) iterateByPostOrder(rightNode));
          

          en
          listOfNode.addAll((Collection<? extends Node>) iterateByPostOrder(rightNode));
          


          En effet, si le ne me trompe pas, la notation <? extends Object> est exclusive, tu ne peux pas mettre d'objet du type Object dans une collection notée comme ça, il faut obligatoirement que ton Objet hérite d'Object.

          Je n'ai pas de meilleure solution
          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2012 à 10:53:08

            Ok, je potasse tout cela et je trouverai bien une solution ;)
            Merci pour votre aide ;)
            • Partager sur Facebook
            • Partager sur Twitter
            Le jour où Microsoft fera des choses qui ne plantent pas, ça sera des clous ...

            [QST] Généricité et retour de methode

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown