Partage
  • Partager sur Facebook
  • Partager sur Twitter

paramètre <uneClass implements uneInterface>

    13 août 2017 à 22:40:42

    J'ai une superclass MaSuperClass, dont certaines sous-classes implémentent mon interface MonInterface

    Est-il possible de passer en paramètre à une fonction , une instance de n'importe quelle sous-classe de MaSuperClass implémentant MonInterface?, bref une syntaxe du genre:

    public void MaFonction(<MaSuperClass implements MonInterface> param1)

    {

    }

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      14 août 2017 à 3:21:15

      Bonsoir,

      Connais tu la politesse ?

      Bonjour, merci... ca te dis quelque chose ou pas ?

      • Partager sur Facebook
      • Partager sur Twitter
        14 août 2017 à 10:46:49

        Merci ça à l'air de ressembler à ce que je cherche!

        Mais je n'ai pas trouvé comment je peux résoudre mon problème avec ça.

        • Partager sur Facebook
        • Partager sur Twitter
          14 août 2017 à 10:50:25

          Ce que tu veux faire doit être:

          public <T implements MonInterface> void ma methode(T param)
          {
          	//Traitement
          }



          • Partager sur Facebook
          • Partager sur Twitter
            14 août 2017 à 11:05:08

            Il y a un truc que je comprend pas, on peu définir le paramètre à l'extérieur de la parenthèse?

            de toute façon pour moi dans ce code (donc j'ai ma super classe EntityCreature, et une interface CarrierEntity):

            public <EntityCreature implements CarrierEntity> void mamethode(EntityCreature param)
              {
            	 //mon code 
              }

            implements est souligné en rouge et éclipse me dit "Syntax error on token"implements",,expected"

            -
            Edité par FoguxXugof 14 août 2017 à 11:06:49

            • Partager sur Facebook
            • Partager sur Twitter
              14 août 2017 à 11:09:34

              J'ai tapé un peu trop vite, remplace le implements par extends et cela devrait fonctionner.

              En faite tu ne définis pas un paramètre mais un Type.

              -
              Edité par florent m 14 août 2017 à 11:11:11

              • Partager sur Facebook
              • Partager sur Twitter
                14 août 2017 à 11:25:32

                ok, du coups:

                public <EntityCreature extends CarrierEntity> void mamethode(EntityCreature param)
                  {
                	  //mon code
                  }

                maintenant EntityCreature est souligné en jaune et il me dit "the type parameterEntityCreature is hiding the type EntityCreature" et quand je fais

                param. je ne peux pas utiliser les méthode de ma classe EntityCreature.

                En fait à la base , je veux un paramètre qui hérite des méthodes de EntityCreature et de CarrierEntity.

                -
                Edité par FoguxXugof 14 août 2017 à 11:28:02

                • Partager sur Facebook
                • Partager sur Twitter
                  14 août 2017 à 11:35:35

                  Quand tu Fais <T extends Machin>, T peux être considéré comme un nouveau type, dans ton cas la méthode devrait être plutôt:

                  public <T extends EntityCreature,CarrierEntity> void mamethode(T param)
                    {
                        //mon code
                    }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 août 2017 à 11:41:19

                    malheureusement,
                    public <T extends EntityCreature,CarrierEntity> void mamethode(T param)
                      {
                          //mon code
                      }

                    remplace le type CarrierEntity (la virgule sert à définir un deuxième type):

                    the type parameter CarrierEntity is hiding the type CarrierEntity.

                    [EDIT]

                    I got it!!

                    public <T extends EntityCreature & CarrierEntity> void mamethode(T param)
                      {
                    	  param.addPassengerAIBuffer();
                          //mon code
                      }

                    Merci bcp j'aurais sans doute pas trouvé tout seul!

                    -
                    Edité par FoguxXugof 14 août 2017 à 11:45:18

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 août 2017 à 11:51:30

                      Je suis vraiment pas réveillé aujourd’hui...

                      Remplace la virgule par un &, par contre cela est régit par les même règle d'héritage que pour une classe.

                      Un petit exemple:

                      	public interface IToto {
                      		public void methode();
                      	}
                      
                      	public interface IToto2 {
                      		public void methode();
                      	}
                      	
                      	public abstract class Foo {
                      		public abstract void methodeAbstract();
                      	}
                      
                      	public abstract class Foo2 {
                      		public abstract void methodeAbstract2();
                      	}
                      
                      	//OK
                      	public <T extends Foo & IToto> void uneMethode(T param) {
                      
                      	}
                      
                      	//OK
                      	public <T extends IToto & IToto2> void uneMethode(T param) {
                      
                      	}
                      	
                      	//Ne fonctionne pas
                      	public <T extends Foo & Foo2> void uneMethode2(T param) {
                      
                      	}

                      Tu peux étendre d'autant d'interface que tu veux mais d'une seul classe (la classe devant être en premier)



                      • Partager sur Facebook
                      • Partager sur Twitter

                      paramètre <uneClass implements uneInterface>

                      × 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