Generics et compatibilité ascendante
J'ai un problème avec une des nouveautés du JDK 5.0, à savoir les Generics. J'utilise un outil pour générer une partie de mon code à partir de mon modèle UML (AndroMDA rulz !) mais il ne génère que du code compatible 1.4 dans un souci de compatibilité ascendante. Autrement dit, il n'utilise pas certaines joyeusetés de Tiger, et notamment les Generics.
Mais moi dans mon application, dans le code que j'écris moi-même avec mes petits doigts boudinés, je sais que la JVM en-dessous ça sera la 1.5, donc je peux utiliser les Generics.
Le petit souci, c'est de savoir comment faire cohabiter les deux : par exemple, je récupère dans une partie générée, donc 1.4, une Collection toute simple, mais je sais que dedans, les Objects en fait ce sont des instances de la classe A. Est-ce que je peux tout simplement faire une affectation comme ça :
Code:
1 2
|
Collection<A> as = getSimpleCollection(); |
sachant que getSimpleCollection() me retourne une Collection et non une Collection<A> ?
Re: Generics et compatibilité ascendante
Salut,
Les Generics ont été concus pour assurer une compatibilité ascendante. Contrairement aux templates du C++, les classes Collection<String> et Collection<Integer> sont exactement les mêmes (getClass() retrounera "Collection" dans les deux cas) puisque le type paramétré est perdu à l'exécution...
En effet avec les Générics, la vérification des types est effectué à la compilation et non pas à l'exécution. Cela a permis d'utiliser les generics dans des classes existantes sans casser la compatibilité ascendante.
Citation:
Envoyé par rozwel
sachant que getSimpleCollection() me retourne une Collection et non une Collection<A> ?
Tu peux très bien le faire, mais tu auras un warning à la compilation pour te prévenir que le compilateur ne peut plus assurer la cohérence des types, et que tu peux potentiellement obtenir des erreurs (par exemple si la méthode getSimpleCollection() a ajoutée des objet qui ne sont pas du type de A)...
Mais si tu es sûr de toi rien ne te l'interdit, et tu peux te passer du warning en utilisant l'annotation @SuppressWarnings("unchecked") devant la signature de ta méthode :
Code:
1 2 3 4
| @SuppressWarnings("unchecked")
public Collection<A> getCollectionA () {
return object.getSimpleCollection(); // warning unckeked
} |
Par contre cette annotation n'est géré que depuis l'update 6 du JDK...
a++