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 :

[Généricité] Conversion à partir du type non paramétré


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut [Généricité] Conversion à partir du type non paramétré
    Bonjour,

    J'ai souvent besoin de convertir depuis un type générique, vers ce même type générique mais bien paramétré. Seulement, quelque soit la manipulation, j'obtiens toujours un warning. J'aimerais savoir s'il y a une "bonne pratique", une méthode alternative et plus sécurisée qui justifierait ces warnings :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	U<S> a;
    	U b;
     
    	...
     
    	a = b;		
    	/* Warining - Type safety: The expression of type U needs unchecked
    	 * conversion to conform to U<S>
    	 */
     
    	a = (U<S>) b;
    	/* Warning - Type safety: The cast from U to U<S> is actually checking
    	 * against the erased type U
    	 */
    Avez-vous une suggestion ?


    Blustuff.

  2. #2
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292

  3. #3
    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,


    Pris en flagrant délit de non-lecture de la FAQ

    Comment caster un type non-paramétré vers son équivalent paramétré ?


    a++

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Ho... exact... Mais en fait, s'il s'agit juste de retirer le warning, ça ne m'intéresse pas vraiment. En gros, si j'ai bien compris, les warnings sont là pour dire "Quoique vous fassiez, il n'y aura aucune vérification ni à la compilation, ni à l'exécution".

  5. #5
    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
    Citation Envoyé par Blustuff Voir le message
    Ho... exact... Mais en fait, s'il s'agit juste de retirer le warning, ça ne m'intéresse pas vraiment. En gros, si j'ai bien compris, les warnings sont là pour dire "Quoique vous fassiez, il n'y aura aucune vérification ni à la compilation, ni à l'exécution".
    Ben oui : les Generics sont basés sur une vérification à la compilation seulement. Donc si le type n'est pas explicite dans le code source alors cette vérification ne peut pas être faite...


    La seule solution à ma connaissance pour avoir un cast "fail-fast" serait de conserver le type paramétré dans ta classe U, par exemple :
    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
    class U<S> {
     
    	/* On conserve le type paramétré en interne dans la classe */
    	private final Class<S> sType;
     
    	/* On impose le type paramétré en paramètre de chaque constructeur */
    	public U(Class<S> type) {
    		if (type==null) {
    			throw new NullPointerException("type null");
    		}
    		sType = type;
    	}
     
     
     
    	/* Cette méthode static permet de caster en vérifiant le type paramétré */
    	@SuppressWarnings("unchecked")
    	public static <X> U<X> cast(U<?> u, Class<X> type) {
    		if (u.sType.equals(type)) {
    			return (U<X>)u;
    		}
    		throw new ClassCastException(u.sType + " != " + type);
    	}
     
    }

    Ce qui donnerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = U.cast(b, S.class);
    Retourne le type paramétré si OK
    Génère une ClassCastException si b n'est pas vraiment un U<S>


    a++

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Ben... la classe on peut la récupérer par introspection avec class.getTypeParameters mais c'est un peu pénible...

    Ce qui m'intrigue, c'est l'intérêt qu'on peut trouver de générer ces warnings. C'est comme si il était considéré que les programmeurs ne savent pas comment fonctionnent la généricité, et qu'il vaut mieux les avertir. C'est comme si il y avait un warning pour chaque méthode non statique qui dirait "Attention, vous devez appeller cette méthode sur un objet".

  7. #7
    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
    Citation Envoyé par Blustuff Voir le message
    Ben... la classe on peut la récupérer par introspection avec class.getTypeParameters mais c'est un peu pénible...
    Non on ne peut pas récupérer le type paramétré mais seulement le type de base.

    Exemple pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class U<T> {
     
    }
     
    U a = new U<String>();
    On pourra récupérer le nom du type paramétré ("T") et son type de base ("Object"), mais on ne pourra pas récupérer le type paramétré utilisé avec une instance particulière (String dans ce cas).

    Le seul cas où il est possible de faire cela c'est lorsqu'on hérite d'une classe ou implémente une interface en spécifiant un type paramétré au lieu de le conserver, c'est à dire lorsqu'on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MaClasse extends ArrayList<String> {
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MaClasse<T> extends ArrayList<T> {
    (mais on perd la généricité au passage[/code]

    Citation Envoyé par Blustuff
    Ce qui m'intrigue, c'est l'intérêt qu'on peut trouver de générer ces warnings.
    Les Generics garantissent un code type-safe lors de la compilation, c'est à dire sans ClassCastException à l'exécution. Or dans ce cas précis le compilateur n'a aucun moyen de garantir cela et il le fait savoir avec un warning...

    Citation Envoyé par Blustuff
    C'est comme si il était considéré que les programmeurs ne savent pas comment fonctionnent la généricité, et qu'il vaut mieux les avertir.
    C'est tout à fait ca
    Citation Envoyé par Blustuff
    C'est comme si il y avait un warning pour chaque méthode non statique qui dirait "Attention, vous devez appeller cette méthode sur un objet".
    Eclipse peut le faire et c'est très pratique

    a++

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Blustuff Voir le message
    Ce qui m'intrigue, c'est l'intérêt qu'on peut trouver de générer ces warnings. C'est comme si il était considéré que les programmeurs ne savent pas comment fonctionnent la généricité, et qu'il vaut mieux les avertir.
    Exactement

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 05/06/2018, 09h36
  2. Conversion vers un type non-scalaire
    Par Gamall dans le forum C
    Réponses: 7
    Dernier message: 08/07/2011, 02h31
  3. Réponses: 6
    Dernier message: 03/04/2008, 16h18
  4. conversion d'un type Extended vers un string
    Par matterazzo dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2005, 19h22
  5. Réponses: 4
    Dernier message: 07/06/2004, 13h34

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