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 :

Comprendre le cast ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Par défaut Comprendre le cast ?
    J'ai du mal à comprendre pourquoi le code suivant marche (partie de code en rouge).

    public interface OlapWrapper {
    // duplicate method from java.sql.Wrapper (JDBC 4.0), so method is available
    // in JDBC 3.0
    <T> T unwrap(Class<T> iface) throws SQLException;

    // duplicate method from java.sql.Wrapper (JDBC 4.0), so method is available
    // in JDBC 3.0
    boolean isWrapperFor(Class<?> iface) throws SQLException;
    }
    // Register driver.
    Class.forName("mondrian.olap4j.MondrianOlap4jDriver");

    // Create connection.
    Connection connection =
    DriverManager.getConnection("jdbc:mondrian:embedded");
    OlapConnection olapConnection =
    ((OlapWrapper) connection).unwrap(OlapConnection.class);
    En fait quand on cast une classe en une autre j'ai un message au runtime (A cannot be cast to B)
    Alors pourquoi (OlapWrapper) connection marcherait alors?

    Merci pour vos réponses.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tout simplement parce que la connexion que tu recois implémente cette interface. Pour que le cast réussise, il faut bien entendu que l'instance concernée soit compatible avec ce cast.

    Si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A a = uneMethodeRetournantUnA();
    B b = (B) a;

    pour que ça marche il faut que l'instance réelle retournée par uneMethodeRetournantUnA implémente ou hérite de B.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Par défaut
    Merci tchize.
    Tout simplement parce que la connexion que tu recois implémente cette interface
    Tu veux alors dire que Connection doit implémenter OlapWrapper?
    Si c'est ça, ce n'est pas le cas dans ce code.

    Merci de ton retour pour éclaircissement.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Non elle ne doit pas, mais ici l'auteur du code assume que, spécifiquement avec les paramètre donnés, il reçoit une instance qui le fait.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Par défaut
    mais ici l'auteur du code assume que, spécifiquement avec les paramètre donnés, il reçoit une instance qui le fait
    j'avoue ne pas avoir compris.

    PS: Je ne suis pas spécialiste java.

  6. #6
    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
    En gros, ce cast

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (OlapWrapper) connection
    Signifie en substance :

    "Je crois que cet objet connection, dont le type déclaré est l'interface Connection, comme on le voit au-dessus, se trouve être une instance du type OlapWrapper. Vérifie. Si j'ai raison, le résultat du cast est cet objet, mais de type OlapWrapper. Si j'ai tort, lance une ClassCastException."

    Cela peut réussir, s'il se trouve que l'objet est bel et bien une instance du type OlapWrapper.
    Et cela peut échouer, dans le cas contraire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Bonjour,

    C'est le unwrap que tu ne comprends pas ?

    Et si tu écris comme ça, ça va mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Connection connection = DriverManager.getConnection("jdbc: ...");
    OlapConnection olapConnection = connection.unwrap(OlapConnection.class);

    Sachant que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public interface OlapConnection extends Connection, OlapWrapper

    Le cast fonctionne.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Par défaut
    Bonjour,

    C'est le unwrap que tu ne comprends pas ?

    Et si tu écris comme ça, ça va mieux :

    Code :

    Connection connection = DriverManager.getConnection("jdbc: ...");
    OlapConnection olapConnection = connection.unwrap(OlapConnection.class);
    c'est bizarre de pouvoir faire connection.unwrap(OlapConnection.class)
    Donc meme si l'interface Connection ne contient pas de méthode unwrap,
    on peut faire :
    Connection con;
    con = ................
    con.unwrap(xxxx);

Discussions similaires

  1. [Procédure][java] A n'y rien comprendre
    Par Stessy dans le forum SQL
    Réponses: 2
    Dernier message: 18/03/2004, 15h05
  2. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 10h46
  3. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 15h00
  4. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 12h07
  5. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49

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