Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/12/2012, 06h22   #1
Seboubou86
Membre régulier
 
Homme
Inscription : septembre 2002
Messages : 205
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : septembre 2002
Messages : 205
Points : 94
Points : 94
Envoyer un message via ICQ à Seboubou86 Envoyer un message via MSN à Seboubou86
Par défaut Question grammaire – Signification des "< >" dans les déclarations

Bonjour,

J’ai une question de grammaire Java. Je suis en train d’étudier un peu JavaFX, et je viens de découvrir une syntaxe que je ne comprends pas très bien. Voici un exemple :
Code :
1
2
3
objet.setOnMouseClicked(new EventHandler<MouseEvent>(){
...
});
J'ai bien compris l'utilité de cette fonction et je serais capable de la réutilisé. Ce que je ne comprend pas c'est l'usage du "<...>".

Voici d'autres exemples d'utilisation des "<...>" :

Code :
1
2
public TableCell<S, T> call(TableColumn<S, T> p) {
...}
et encore

Code :
ObservableList<Person> data = tableView.getItems();
Pour ce dernier exemple, je pense que "<Person>", sert à préciser l'objet utilisé dans une collection.



Quelqu'un pourrait-il éclairer ma lanterne ?
__________________
le problème se situe souvent entre la chaise et le clavier.
@@++
Seboubou86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 09h05   #2
vinou92340
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Ouaip, Person est la classe des objets contenus dans la collection.
Pour tableCell<S,T> , je t invite à aller voir ce lien pour le cas tableColumn où S et T sont détaillés :

http://docs.oracle.com/javafx/2/api/...bleColumn.html

Sauf que dans le cas d une cellule, T devient:
The type of the item contained within the Cell.

Voila chef
  Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 09h40   #3
Seboubou86
Membre régulier
 
Homme
Inscription : septembre 2002
Messages : 205
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : septembre 2002
Messages : 205
Points : 94
Points : 94
Envoyer un message via ICQ à Seboubou86 Envoyer un message via MSN à Seboubou86
Merci pour cette réponse !

En fait ma question était d'ordre générique au niveau du langage java !

Que veulent dire ces deux caractère ? L idée étant de comprendre et de pouvoir le reproduire !
__________________
le problème se situe souvent entre la chaise et le clavier.
@@++
Seboubou86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 10h14   #4
vinou92340
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
En gros en java, c est généralement tout simplement le type d objets (donc la classe) contenus par exemple dans les collections et plus généralement dans tout conteneur (ex: tout ce qui s apparente à java.util.arraylist, set, list,...).
Après, rien ne t'empêche de mettre <Object> et de mettre des objets de type différent. Cependant, il faudra les convertir lors de la récupération dans le bon type. Voilà.

Dernière modification par vinou92340 ; 26/12/2012 à 10h41.
  Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 12h35   #5
adiGuba
Expert Confirmé Sénior
 
Avatar de adiGuba
 
Homme
Développeur Java/Web
Inscription : avril 2002
Messages : 12 654
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Corse (Corse)

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

Informations forums :
Inscription : avril 2002
Messages : 12 654
Points : 22 428
Points : 22 428
Salut,


Il s'agit des "types paramétrés", aussi nommées "Generics".

Lorsque tu définis une classe, tu peux lui associé un ou plusieurs types paramétrés, que tu pourras réutiliser partout ailleurs dans cette même classe.

Par exemple prenons la classe suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyType {
 
    private Object value;
 
    public MyType() {
 
    }
 
    public void setValue(Object value) {
        this.value = value;
    }
 
 
    public Object getValue() {
        return this.value;
    }
 
}

Le problème lorsque tu utilises cette classe, c'est que tout passe par objet et que rien n'est vérifié à la compilation. Il te faut rajouter des cast pour faire compiler le code.
Le problème c'est que du coup il n'est pas sûr, si tu fais ceci par exemple :
Code :
1
2
3
4
5
MyType t = new MyType();
t.setValue( new Integer(0) );
 
Integer i = (Integer) t.getValue(); // OK mais cast obligatoire
Double d = (Double) t.getValue(); // => ClassCastException
Le code compile normalement et sans warning/erreur, mais tu aura une ClassCastException à l'exécution (car "value" est un Integer alors que tu le cast en Double).




Pour éviter cela on va rajouter un type paramétré à la classe, ce qui nous donne le code suivant (par convention les types paramétrés sont composé d'une seule lettre en majuscule)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MyType<V> {
 
    private V value;
 
    public MyType() {
 
    }
 
    public void setValue(V value) {
        this.value = value;
    }
 
 
    public V getValue() {
        return this.value;
    }
 
}
Lorsqu'on écrit "MyType", on ne connait pas le type paramétré, mais on sait juste que le type "V" sera le même pour une même instance.

Du coup désormais lorsqu'on va utiliser notre objet "MyType", il faudra préciser le type, par exemple :
Code :
1
2
3
MyType<String> t = new MyType<String>();
// Ou depuis Java 7 avec l'inférence de type :
MyType<String> t = new MyType<>();
Le compilateur saura alors que le paramètre "V" correspond en fait au type "String", et il pourra alors effectuer des vérifications supplémentaire quand à la validité des paramètres.

Si on reprend le code précédent, on n'a plus besoin de caster, et même si on fait un cast incorrect le compilateur pourra nous le signaler dès la compilation (ce qui permet d'éviter de faire passer des erreurs involontaires) :
Code :
1
2
3
4
5
MyType<Integer> t = new MyType<Integer>();
t.setValue( new Integer(0) );
 
Integer i = t.getValue(); // OK, cast inutile
Double d = (Double) t.getValue(); // => Erreur de compilation

Il y a plein d'autres spécificités et cas d'utilisation, mais en clair les Generics permettent un code plus sécurisé, en indiquant au compilateur les types avec lesquels on souhaite travailler.





Plus d'info ici : http://lroux.developpez.com/article/...ge_5#Lgenerics

a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java Présentation de Java SE 7 (commentaires)
adiGuba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 21h15   #6
Seboubou86
Membre régulier
 
Homme
Inscription : septembre 2002
Messages : 205
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : septembre 2002
Messages : 205
Points : 94
Points : 94
Envoyer un message via ICQ à Seboubou86 Envoyer un message via MSN à Seboubou86
Merci adiGuba !

Tu as vraiment bien répondu à ma question. Je vais lire le tutoriel de Lroux sur les générics pour approfondire ma connaissance de cet outil.
__________________
le problème se situe souvent entre la chaise et le clavier.
@@++
Seboubou86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h39.


 
 
 
 
Partenaires

Hébergement Web