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 :

Typage : Object vers MonObjet


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Par défaut Typage : Object vers MonObjet
    Bonjour,

    J'utilise une sérialisation AMF pour échanger des objets entre un module Flex et une application Java.
    Lors de la désérialisation, j'obtiens un objet de type Object que je caste en MonObjet (connu mais pouvant être n'importe quoi héritant de Object). Lors de ce cast, j'obtiens un warning tout ce qu'il y a de plus compréhensible ("Type safety: Unchecked cast from Object to T")... mais que je ne vois pas du tout comment corriger.

    Ça fonctionne, mais s'il y a un warning, c'est qu'il y a probablement quelque chose de plus élégant à faire.

    Y a-t-il une solution de "blindage" générique ?

    Le code de la méthode incriminée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try {
        final byte[] input = dec.decode(amf);
        final InputStream bIn = new ByteArrayInputStream(input);
        final Amf3Input amf3Input = new Amf3Input(getSerializationContext());
        amf3Input.setInputStream(bIn);
        T obj = (T) amf3Input.readObject(); // Et là, ça couine. 
        return obj;
    } catch (final IOException e) {
        // Hop hop.
    } catch (final ClassNotFoundException e) {
        // Hop hop aussi.
    }
    Merci !

    Alban

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le problème vient du fait que les casts s'associent mal avec les Generics.

    Les Generics te garantissent un code sans erreur de type, grâce au compilateur qui a la charge de vérifier la cohérence du typeage de ton code.

    Or les casts peuvent engendrer des erreurs à l'exécution. De plus comme le code des Generics est "perdu", il y a certains casts qui n'en sont pas réellement et qui sont en fait exécuté plus tard.

    Bref si tu mélanges des casts et du code Generics, le compilateur ne peut plus assurer la cohérence de l'ensemble, et il t'indique cela via ce warning.



    Si tu es parfaitement sûr de toi, tu peux utiliser l'annotation @SuppressWarnings pour indiquer au compilateur que tu comprends le problème et que tu prends cela en charge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @SuppressWarnings("unchecked")
    T obj = (T) amf3Input.readObject();

    a++

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Par défaut
    Merci pour les précisions.

    Pour tout dire, je suis sûr de l'utilisation que je vais faire de ce code, je suis sûr du code lui-même (il est testé et éprouvé)... mais j'aimerais autant éviter à mes gentils collègues de mettre le pied dans un piège à loup si je peux l'éviter.

    Ceci dit, je suis prêt à ne pas utiliser les génériques s'il y a un autre moyen (simple ou presque) de le faire. Sinon, je taperai dans le suppressWarnings... ça ne sera pas la première fois (même si ça me fait toujours mal au coeur ).

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Il faudrait voir le code de la méthode entière... mais en général ce n'est pas bien méchant.

    Ici le problème est déplacé de quelque ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        T obj = (T) amf3Input.readObject();
        return obj;
    En cas de type incorrect, il n'y aura pas de ClassCastException sur le cast, mais uniquement après le retour de la méthode...

    a++

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Par défaut
    En fait, toute la méthode est là. C'est une méthode utilitaire qui se tape la conversion.

    Ma requête HTTP contient l'objet en AMF (encodé en base 64), c'est le paramètre d'entrée de la méthode (String amf) et je renvoie l'objet désérialisé de type T :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjet obj = AmfUtil.<MonObjet> fromAmf(amf); // Avec la-dedans le code ci-dessus

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Je voulais avoir toute la méthode, avec sa signature exacte.


    Je suppose que tu as quelques chose comme cela :
    Le problème c'est qu'en cas d'usage incorrect, tu peux te trimballer un T avec un type incorrect, et qui risque de te péter à la figure bien plus loin dans le code, et de manière totalement inattendu.

    Pour sécuriser cela il faudrait rajouter le type Class<T> en paramètre, afin de faire un cast sécurisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public <T> T method(Class<T> baseClazz)
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        T obj = baseClazz.cast( amf3Input.readObject() );
        return obj;
    Ce qui a le mérite de te péter à la gueule tout de suite en cas de soucis


    a++

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

Discussions similaires

  1. migration Business object vers cognos
    Par lahdeb dans le forum Administration-Migration
    Réponses: 0
    Dernier message: 19/12/2013, 16h55
  2. Réponses: 1
    Dernier message: 21/06/2013, 09h48
  3. Object vers List<Object>
    Par lahmar.abdel1 dans le forum Langage
    Réponses: 10
    Dernier message: 07/09/2010, 13h12
  4. Cast de Object vers Image
    Par krolis dans le forum C#
    Réponses: 1
    Dernier message: 17/05/2010, 19h19
  5. [C#] Conversion implicite de type object vers int
    Par alexking2005 dans le forum C#
    Réponses: 5
    Dernier message: 02/01/2007, 10h02

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