Question génériqueS

Le
ToOmS
Bonjour à tous,

Je viens de lire cet article :
http://java.dzone.com/articles/5-things-you-should-know-about-java-generics=
?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+javalobby=
%2Ffrontpage+%28Javalobby+%2F+Java+Zone%29&utm_content=Google+Reader

et j'avoue ne pas avoir tout pigé concernant la différence entre
"extends" et "super", dans le point 4.
Effectivement, on trouve bien dans l'API (java.util.Collections) ce
genre de choses :

static <T> boolean addAll(Collection<? super T> c, T a)
static <T> int binarySearch(List<? extends Comparable<? super T>>
list, T key)
static <T> int binarySearch(List<? extends T> list, T key,
Comparator<? super T> c)

Je n'avais même pas remarqué le coup du "static <T>", passons. Mais le
mélange extends/super reste assez occulte en ce qui me concerne.
Quelqu'un a-t-il une explication claire, en français, ou un lien vers
une doc en ligne ?

Merci d'avance, Thomas.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
ToOmS
Le #22524301
On 31 août, 11:29, ToOmS
Bonjour à tous,

Je viens de lire cet article :http://java.dzone.com/articles/5-things-you -should-know-about-java-ge...

... et j'avoue ne pas avoir tout pigé concernant la différence entre
"extends" et "super", dans le point 4.
Effectivement, on trouve bien dans l'API (java.util.Collections) ce
genre de choses :

static <T> boolean addAll(Collection<? super T> c, T... a)
static <T> int binarySearch(List<? extends Comparable<? super T>>
list, T key)
static <T> int binarySearch(List<? extends T> list, T key,
Comparator<? super T> c)

Je n'avais même pas remarqué le coup du "static <T>", passons. Mais l e
mélange extends/super reste assez occulte en ce qui me concerne.
Quelqu'un a-t-il une explication claire, en français, ou un lien vers
une doc en ligne ?

Merci d'avance, Thomas.



j'ai trouvé ça (Java theory and practice: Going wild with generics),
peut-être que ça aidera :
http://www.ibm.com/developerworks/java/library/j-jtp04298.html
http://www.ibm.com/developerworks/java/library/j-jtp07018.html

A+
Mayeul
Le #22531411
On 31/08/2010 11:29, ToOmS wrote:
Bonjour à tous,

Je viens de lire cet article :
http://java.dzone.com/articles/5-things-you-should-know-about-java-generics?utm_sourceþedburner&utm_mediumþed&utm_campaignþed%3A+javalobby%2Ffrontpage+%28Javalobby+%2F+Java+Zone%29&utm_content=Google+Reader

... et j'avoue ne pas avoir tout pigé concernant la différence entre
"extends" et "super", dans le point 4.
Effectivement, on trouve bien dans l'API (java.util.Collections) ce
genre de choses :

static<T> boolean addAll(Collection<? super T> c, T... a)
static<T> int binarySearch(List<? extends Comparable<? super T>>
list, T key)
static<T> int binarySearch(List<? extends T> list, T key,
Comparator<? super T> c)

Je n'avais même pas remarqué le coup du "static<T>", passons. Mais le
mélange extends/super reste assez occulte en ce qui me concerne.
Quelqu'un a-t-il une explication claire, en français, ou un lien vers
une doc en ligne ?



Un truc qui m'a aidé, mais dont je ne me souviens pas où je l'ai lu :

- Une List<?> est une liste de trucs dont on ne sait pas ce que c'est.
* On peut toujours demander la taille de la liste, et parcourir son
contenu en tant qu'Object, parce que chaque élément est quand même au
moins un Object ou une sous-classe d'Object.
* On ne peut rien y ajouter, parce qu'on ne sait pas ce que contient la
liste, et donc on ne sait pas si ce qu'on veut ajouter peut y aller.

- Une List<? extends T> est une liste de trucs dont on ne sait pas ce
que c'est, mais qui, en tout cas, est une sous-classe de T ou bien un T.
* On peut parcourir ses éléments sous forme de T, parce que ce sont tous
soit des T soit une sous-classe.
* On ne peut rien y ajouter, parce qu'on ne sait pas ce que contient la
liste, et donc on ne sait pas si ce qu'on veut ajouter peut y aller.
* À noter qu'on peut faire une List<? extends Date>, et qu'on ne sait
pas si elle contient des Date, des Timestamp, des DateTime ou autre
chose, mais en tout cas c'est soit Date soit une sous-classe.
* À noter que List<?> est un raccourci de List<? extends Object>

- Une List<? super T> est une liste de trucs dont on ne sait pas ce que
c'est, mais qui, en tout cas, est une classe mère de T ou bien un T.
* On peut lui ajouter des T ou des sous-classes de T, parce qu'on sait
qu'un T ou ses sous-classes sont forcément classe ou sous-classe du
contenu de la liste.
* On ne peut parcourir son contenu que comme Object, parce qu'on ne sait
pas exactement ce qu'elle contient.

Autrement dit :
- ? extends T : l'objet donne des T
- ? super T : l'objet accepte des T
- T : l'objet donne et accepte des T

--
Mayeul
ToOmS
Le #22531861
On 1 sep, 19:48, Mayeul
On 31/08/2010 11:29, ToOmS wrote:



> Bonjour à tous,

> Je viens de lire cet article :
>http://java.dzone.com/articles/5-things-you-should-know-about-java-ge...

> ... et j'avoue ne pas avoir tout pigé concernant la différence entr e
> "extends" et "super", dans le point 4.
> Effectivement, on trouve bien dans l'API (java.util.Collections) ce
> genre de choses :

> static<T>  boolean addAll(Collection<? super T>  c, T... a)
> static<T>  int binarySearch(List<? extends Comparable<? super T>>
> list, T key)
> static<T>  int binarySearch(List<? extends T>  list, T key,
> Comparator<? super T>  c)

> Je n'avais même pas remarqué le coup du "static<T>", passons. Mais le
> mélange extends/super reste assez occulte en ce qui me concerne.
> Quelqu'un a-t-il une explication claire, en français, ou un lien vers
> une doc en ligne ?

Un truc qui m'a aidé, mais dont je ne me souviens pas où je l'ai lu :

- Une List<?> est une liste de trucs dont on ne sait pas ce que c'est.
* On peut toujours demander la taille de la liste, et parcourir son
contenu en tant qu'Object, parce que chaque élément est quand même au
moins un Object ou une sous-classe d'Object.
* On ne peut rien y ajouter, parce qu'on ne sait pas ce que contient la
liste, et donc on ne sait pas si ce qu'on veut ajouter peut y aller.

- Une List<? extends T> est une liste de trucs dont on ne sait pas ce
que c'est, mais qui, en tout cas, est une sous-classe de T ou bien un T.
* On peut parcourir ses éléments sous forme de T, parce que ce sont t ous
soit des T soit une sous-classe.
* On ne peut rien y ajouter, parce qu'on ne sait pas ce que contient la
liste, et donc on ne sait pas si ce qu'on veut ajouter peut y aller.
* À noter qu'on peut faire une List<? extends Date>, et qu'on ne sait
pas si elle contient des Date, des Timestamp, des DateTime ou autre
chose, mais en tout cas c'est soit Date soit une sous-classe.
* À noter que List<?> est un raccourci de List<? extends Object>

- Une List<? super T> est une liste de trucs dont on ne sait pas ce que
c'est, mais qui, en tout cas, est une classe mère de T ou bien un T.
* On peut lui ajouter des T ou des sous-classes de T, parce qu'on sait
qu'un T ou ses sous-classes sont forcément classe ou sous-classe du
contenu de la liste.
* On ne peut parcourir son contenu que comme Object, parce qu'on ne sait
pas exactement ce qu'elle contient.

Autrement dit :
- ? extends T : l'objet donne des T
- ? super T : l'objet accepte des T
- T : l'objet donne et accepte des T

--
Mayeul



OK, très clair. Merci beaucoup !
Publicité
Poster une réponse
Anonyme