p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre régulier
    Inscrit en
    novembre 2009
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 225
    Points : 70
    Points
    70

    Par défaut Méthode générique non static

    Bonjour voici un code très simple mais je ne vois pas pourquoi çà coince

    Meci de votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package ajeter;
     
     
    class C <T> {
     
    	public void  m1(<? extends T> val2){
    				System.out.println(val2);
     
    	}
    }
     
    public class Nice2 {
    	public static void main(String[] args) {
    		Integer i = 4;
    		C<Number> c = new C<Number>();
    		c.m1(i);
    	}
    }

  2. #2
    Invité de passage
    Inscrit en
    juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : juillet 2005
    Messages : 8
    Points : 3
    Points
    3

    Par défaut

    Bonjour,
    si j'ai bien compris ce que tu veux faire, je te propose ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class C<T> {
     
      public void m1(T val2) {
        System.out.println(val2);
      }
    }
     
    public class Nice2 {
     
      public static void main(String[] args) {
        C<? super Integer> c = new C<Number>();
        c.m1(4);
      }
     
    }
    cordialement

  3. #3
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    10 367
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 367
    Points : 17 293
    Points
    17 293

    Par défaut

    Citation Envoyé par michelp3 Voir le message
    Bonjour voici un code très simple mais je ne vois pas pourquoi çà coince
    Parce que <? extends T> n'est pas un type et n'a donc rien à faire tout seul devant un nom de variable.

    Si tu cherches un type générique auquel on peut assigner n'importe quel objet de type T ou d'un sous-type de T.... Eh ben c'est T, tout simplement. Principe habituel de l'héritage.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  4. #4
    Membre régulier
    Inscrit en
    novembre 2009
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 225
    Points : 70
    Points
    70

    Par défaut Bonjour Thelvin, ncckto

    OK mais alors comment je fais si je souhaite imposer

    que les arguments passés à la méthode soient des classes filles de T

  5. #5
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    10 367
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 367
    Points : 17 293
    Points
    17 293

    Par défaut

    Uniquement des classes filles et pas T lui-même ? Tu peux pas. Une méthode par classe fille acceptée.

    Bien sûr, une idée simple serait de le faire quand tu choisis T : faire que ce soit une interface, ou une classe abstraite. Comme une interface ou une classe abstraite ne peuvent pas être instanciées, les objets seront forcément de classes filles.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  6. #6
    Membre régulier
    Inscrit en
    novembre 2009
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 225
    Points : 70
    Points
    70

    Par défaut Merci

    Ok pour la question précédente mais ceci est aussi basique et m'ennuie autant

    Pourquoi la méthode add() ne fonctionne pas

    Merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    package ajeter;
     
    import java.util.ArrayList;
    import java.util.List;
     
    class Personne{
     
    }
     
    class Employee extends Personne{
     
    }
     
    public class Nice3_75_76 {
    	public static void main(String[] args) {
    		List <? extends Personne> al = new ArrayList<Employee>();
     
    			Employee employee = new Employee();
     
    			al.add(new Employee());
     
     
    	}
     
    }

  7. #7
    Membre expérimenté Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    octobre 2012
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : octobre 2012
    Messages : 340
    Points : 589
    Points
    589

    Par défaut

    Comme d'habitude, je suis pas sur, mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Employee employee = new Employee();
     
    			al.add(new Employee());
    ne devrait-il pas être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Employee employee = new Employee();
     
    			al.add(employee);
    et ensuite, si comme c'est dit plus haut tu as fait de Personne une classe abstraite (ou une interface...), pourquoi ne pas mettre simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List <Personne> al = new ArrayList<Employee>();
    Toute complication entraîne un risque d'erreur... Je fais comme ça dans l'appli RH sur laquelle je bosse, et je n'ai pour l'instant jamais vu de Personne abstraite se pointer sur mon UI...

  8. #8
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 22 812
    Points : 43 305
    Points
    43 305

    Par défaut

    Je crois que tu as mal compris comment marche "?" dans les generic.

    Ca ne veux pas dire "n'importe quoi", ça veux dire "quelque chose que je ne connais pas".

    Ainsi quand tu dis que tu as une List<? extends Employee>, tu es occupé de dire au compilateur que la liste contient un type bien précis qui étends Employé MAIS que tu ne connais pas ce type (ça peut être Chef, Ouvrier ou ResponsableSyndicale).

    Du coup, quand tu appelle la méthode add(T), le compilateur est incapable de connaitre le Type concret accepté et du coup est incapable de dire si le type Employee que tu essaie de passer en paramètre est recevable.


    Pour expliquer avec un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Chef> liste = new ArrayList<Chef>();
    List<? extends Employee> autreliste  = liste ; // ceci est valable, Chef est bien un QuelqueChose qui étends employé
    autreliste.add(new Employee("Jean")); // est interdit
    Chef chef = liste.get(0); // Sinon là on aurait un sérieux problème et un classcastexception à l'exécution.
    Dis encore autrement, List<Employee>, ce n'est pas la même chose du tout que List<? extends Employee>

    Dans le premier on peux lui passer des employés ou des sous type de employé. Dans le deuxième, on peux lui passer un "?" ou un sous type. Et comme on ne connais par définition pas ?, ça limite fortement l'utilisation
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

  9. #9
    Membre régulier
    Inscrit en
    novembre 2009
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 225
    Points : 70
    Points
    70

    Par défaut Un peu plus lion

    Bonjour Tchize et merci de ton explication complète qui m'a permis d'avancer

    J'ai d'ailleurs revu mon code qui marie maintenant

    GENERICITE et POLYMORPHISME

    Voic le code , votre avis : Utile ou pas ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    package ajeter;
     
    import java.util.ArrayList;
    import java.util.List;
     
    class Personne{
    	public String nom;
    	public Personne(String nom) {
    		this.nom = nom;
    	}
    	public void quisuisje() {
    		System.out.println("Je suis la méthode Personne");
    	}
    }
     
    class Employee extends Personne{
     
    	public Employee(String nom) {
    		super(nom);
    	}
    	public void quisuisje() {
    		System.out.println("Je suis la méthode Employee");
    	}
    }
     
    class Outils extends Personne{
     
    	public Outils(String nom) {
    		super(nom);
    	}
    	public void quisuisje() {
    		System.out.println("Je suis la méthode Outils");
    	}
    }
     
    public class Nice3_75_76 {
    	public static void main(String[] args) {
     
    		// idée de départ afin d'ajouter des Employee à list0
    		// List <Personne> liste0 = new ArrayList<Employee>();  //NOT OK
    		//**************************************************************
     
    		// Contourner le problème 
    		//***********************
    		ArrayList<Employee> ae = new ArrayList<Employee>();
    		ae.add(new Employee("Patrick"));
    		ae.add(new Employee("Edouard"));
    		for (Employee employee : ae) {
    			System.out.println(employee.nom);
    		}
     
    		List<Personne> liste0 = new ArrayList<Personne>();
     
    		System.out.println("--------------");
    		List <? extends Personne> l = ae;						
    			for (Personne employee : l) {
    			System.out.println(employee.nom);
    			liste0.add(employee);
    		}
     
    		System.out.println("------------------");
    		for (Personne personne : liste0) {
    			System.out.println(personne.nom);
    		}
     
    		// Mélanger les Employee et les Outils Mais 
    		// a chacun sa methode 
    		//************************************
    		System.out.println("************************");
    		ArrayList<Outils> ao = new ArrayList<Outils>();
    		ao.add(new Outils("marteau"));
    		ao.add(new Outils("tournevis"));
    		for (Outils outils : ao) {
    			System.out.println(outils.nom);
    		}
     
    		System.out.println("--------------");
    		l = ao;						
    			for (Personne outils : l) {
    			System.out.println(outils.nom);
    			liste0.add(outils);
    		}
     
    		System.out.println("------------------");
    			for (Personne personne : liste0) {
    				System.out.println(personne.nom);
    				personne.quisuisje();
    			}
     
    	}
     
    }

  10. #10
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 22 812
    Points : 43 305
    Points
    43 305

    Par défaut

    pour info, tu n'es pas obligé de faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		l = ao;						
    			for (Personne outils : l) {
    			System.out.println(outils.nom);
    			liste0.add(outils);
    		}
    Pour ajouter des items à liste0, tu peux simplement écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			liste0.addAll(ao);
    ao contient des outils, des outils sont des personnes (ahem, pas le dire aux syndicats), donc on peux ajouter le contenu de ao dans liste0
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/07/2015, 09h06
  2. Réponses: 3
    Dernier message: 18/08/2010, 11h41
  3. Erreur méthode non générique non trouvé
    Par xavpiaf dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/10/2008, 10h39
  4. [paint] Méthode déclaré en static
    Par Bugmaster dans le forum AWT/SWING
    Réponses: 5
    Dernier message: 23/08/2004, 15h51
  5. [EJB] [JSP] Méthode EJB non reconnue dans jsp
    Par stago dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 06/07/2004, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo