IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Méthode générique non static


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    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
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 8
    Points
    8
    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

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    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

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    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 éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    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...
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Points : 114
    Points
    114
    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 éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/07/2015, 09h06
  2. Utiliser une méthode non-static dans une méthode static
    Par mcfly37 dans le forum Débuter avec Java
    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