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 :

Blocage sur type cast dynamique avec une Interface


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 20
    Par défaut Blocage sur type cast dynamique avec une Interface
    Bonjour
    Je dois mettre en "LinkedList" des instances d'objets de classes différentes. Ces classes implémentent toutes la même méthode, et je veux, une fois que je dépile mes objets, appeler cette méthode sur chacun pour réaliser une opération. Pour simplifier, je donne un exemple avec deux classes qui font l'addition et la soustraction de deux nombres : la réalité est évidemment bien plus complexe.
    J'ai utilisé une Interface, que je déclare dans chaque classe, et je fais un "cast" de mes objets dépilés sur cet interface. Cela me génère une erreur. Pas d'erreur signalée à la compilation. Plantage sur l'appel d "effectuer" à l'exécution. Quelqu'un peut il m'expliquer pourquoi, et ce qu'il faudrait que je modifie pour pouvoir appeler cette méthode "effectuer" ? Désolé pour l'indentation qui ne passe pas sur le forum, je ne sais pas comment faire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public interface Operation {int effectuer (int a, int b) ;}
     
    public class Addition implements Operation {
        int effectuer (int a, int b){return (a+b) ;}
    }
    public class Soustraction implements Operation {
        int effectuer (int a, int b){return (a-b) ;    }    
    }
    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
    import java.util.* ;
    public class Essai {
        public static void main (String[]args){
            // initialisation d'une série de calculs
            LinkedList calcul = new LinkedList () ;
            calcul.add (new Addition());
            calcul.add (new Soustraction());
            // Excution de la série de calculs
            Iterator i = calcul.iterator() ;
            while (i.hasNext()) {
                Operation o = (Operation)i.next();
                int r = o.effectuer (5, 3) ;
                System.out.println ("Resultat = " + r);
            }
        }
    }

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    1) Peut-on avoir le texte du message d'erreur ?

    2) Avec quelle versoin de Java travaillez-vous ?

    3) Connaissez-vous les génériques en java ?

    Alu lieu d'utiliser un cast, on pourrait déclarer la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkedList<Operation> calcul = new LinkedList<>();

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par jowo Voir le message
    Alu lieu d'utiliser un cast, on pourrait déclarer la liste:
    En fait c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkedList<Operation> calcul = new LinkedList<>();
    Il ne faut pas oublier les chevrons. Ça fait des warnings désagréables.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 20
    Par défaut
    Merci pour la réponse rapide. Je ne connaissais pas cette écriture avec les chevrons <...>, donc je vais voir ça. Je me remets à Java après une interruption d'une dizaine d'années, donc ceci explique cela.

    Environnement de développement :
    Product Version: NetBeans IDE 8.1 (Build 201510222201)
    Updates: Updates available to version NetBeans 8.1 Patch 1
    Java: 1.8.0_101; Java HotSpot(TM) 64-Bit Server VM 25.101-b13
    Runtime: Java(TM) SE Runtime Environment 1.8.0_101-b13
    System: Windows 7 version 6.1 running on amd64; Cp1252; fr_FR (nb)
    User directory: C:\Users\jipe\AppData\Roaming\NetBeans\8.1
    Cache directory: C:\Users\jipe\AppData\Local\NetBeans\Cache\8.1

    Message d'erreur :
    Exception in thread "main" java.lang.IllegalAccessError: Test.Addition.effectuer(II)I
    at Test.Essai.main(Essai.java:13)
    C:\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1*

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    IllegalAccessError est une sous-exception de IncompatibleClassChangeError, le genre de trucs qui arrive quand on ne recompile pas ses classes après les avoir changées.

    Moi je pense que tu as bel et bien un message d'erreur à la compilation. Principalement parce que tes méthodes effectuer() ne sont pas déclarées public, alors que c'est obligatoire puisqu'elles sont déclarées par une interface.

    Je n'ai pas l'habitude de Netbeans, mais à mon avis tu devrais essayer de faire un clean de ton projet et vérifier si tu n'as vraiment pas d'erreur de compilation (ce qui est impossible puisque tes classes ont bel et bien des erreurs de compilation.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 20
    Par défaut
    Hum, après modification de la méthode main de ma classe Essai, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            // initialisation d'une série de calculs
            LinkedList<Operation> calcul = new LinkedList<>();
            calcul.add (new Addition());
            calcul.add (new Soustraction());
            // Exécution de la série de calculs
            Iterator i = calcul.iterator() ;
            while (i.hasNext()) {
                Operation o = (Operation)i.next();
                int r = o.effectuer (5, 3) ;
                System.out.println ("Resultat = " + r);
            }
    Ca plante toujours pareil sur o.effectuer() et que je mette ou non le type cast (Operation) sur la récupération de l'objet en sortie de liste, ça ne change rien...
    Exception in thread "main" java.lang.IllegalAccessError: Test.Addition.effectuer(II)I at Test.Essai.main(Essai.java:#) # = ligne 9 dans le code ci dessus

  7. #7
    Membre averti
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 20
    Par défaut
    Ach so... j'ai posté pendant que la réponse arrivait. Je reprends donc les classes Addition et soustraction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public interface Operation {int effectuer (int a, int b) ;}
     
    public class Addition implements Operation {
        public int effectuer (int a, int b){return (a+b) ;}
    }
    public class Soustraction implements Operation {
        public int effectuer (int a, int b){return (a-b) ;    }    
    }
    Et la méthod essai comme dans mon post précédent, _AVEC_ le type cast sur l'interface Operation :
    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
    import java.util.* ;
    public class Essai {
        public static void main (String[]args){
            // initialisation d'une série de calculs
            LinkedList<Operation> calcul = new LinkedList<>();
            calcul.add (new Addition());
            calcul.add (new Soustraction());
            // Excution de la série de calculs
            Iterator i = calcul.iterator() ;
            while (i.hasNext()) {
                Operation o = (Operation) i.next();
                int r = o.effectuer (5, 3) ;
                System.out.println ("Resultat = " + r);
            }
        }
    }
    Je refais un build du projet (effectivement il signalait les erreurs). Et là ça marche :
    Resultat = 8
    Resultat = 2

    Comme affiché sur un dessin humoristique qui ornait mon bureau en début de carrière, "un bug peut en cacher un autre"...
    Merci encore de m'avoir remis sur les rails

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/03/2011, 18h29
  2. Réponses: 3
    Dernier message: 08/04/2010, 11h29
  3. Réponses: 3
    Dernier message: 22/11/2005, 19h30
  4. Couleur de cellule XSL dynamique avec une variable
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/10/2005, 11h10
  5. [VB.NET] Erreur sur la creation dynamique d'une texbox
    Par headcooper dans le forum ASP.NET
    Réponses: 4
    Dernier message: 01/07/2004, 19h34

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