Questions sur la généricité. - Java - Programmation
Marsh Posté le 11-04-2005 à 13:42:56
1) 'me sousviens plus mais y'avait une bonne raison
2) parce que list.get(0) peut te renvoyer un Carré.
c'est pour pouvoir faire list.add(monCarré) qu'on utilise ce type, pas dans l'autre sens.
3) pour dire que T est une inconnue, pour pas que le compilo tente d'aller chercher une classe T et qu'il ne la trouve pas et rale.
Marsh Posté le 11-04-2005 à 13:55:21
Ok merci beacoup
J'ai une autre question, je suis entrain d'implementer une classe ABR génerique et je bloque sur la compraison d'objets dont le type est "un parametre de type", bref :
Code :
|
En gros, comment puis-je comparer la valeur de la racine avec l'élement à inserer si je ne connait pas le type de la valeur de la racine, <E> ici ?
EDIT : Comment dire que E va implementer Comparable ?
Marsh Posté le 11-04-2005 à 14:01:14
1) ben t'as donné toi même la réponse. Ce sont les éléments qui sont parents, pas les conteneurs.
Marsh Posté le 11-04-2005 à 14:20:41
Merci Taz.
Sinon pour mon ABR j'ai bien l'impression qu'il faut que j'ajoute un comparator en attribut de la classe pour avoir un moyen plus souple de comparer les elements, parce que là avec une seule compareTo je m'en sortirais pas
Marsh Posté le 11-04-2005 à 15:42:58
Code :
|
Je sais que c'est bourrin de caster comme ca mais y a t il un autre moyen de dire qu'un objet de type E va implementer comparable ???
Marsh Posté le 11-04-2005 à 15:46:44
oui, <E extends Comparable>
Marsh Posté le 11-04-2005 à 15:59:21
Ok et si on est pas sur, enfin je veux dire si on est pas sur que E va forcement l'implementer ?
Marsh Posté le 11-04-2005 à 16:10:30
genre un truc un peu normand ?
p'têt ben qu'oui, p'têt ben qu'non ...
Marsh Posté le 11-04-2005 à 16:26:11
Bein oué des StringBuffer ou StringBuilder par exemple
EDIT :
Avec ta technique, si j'ai un
public class ArbreBinaireRecherche<E extends java.lang.Comparable> mon ABR ne pourras contenir QUE des objets qui implementent comparable, c'est pas top ca.
Marsh Posté le 11-04-2005 à 16:36:42
en même temps, pour avoir un arbre binaire, c'est plus facile quand il existe une comparaison.
Si tu veux laisser la possibilité d'avoir un comparateur externe, heu, je t'explique la feinte dès que j'ai plus de temps mais c'est assez malin.
Marsh Posté le 11-04-2005 à 16:39:45
nraynaud a écrit : en même temps, pour avoir un arbre binaire, c'est plus facile quand il existe une comparaison. |
http://java.sun.com/j2se/1.4.2/doc [...] rator.html
Marsh Posté le 11-04-2005 à 16:59:30
-- > oué, mais il faut wrapper le truc pour qu'un coup la classe dépende d'un comparator interne qui utilise le compare de l'objet et d'un autre elle dépende d'un comparator qui est passé en argument à la création, le tout bien typé.
Marsh Posté le 12-04-2005 à 14:42:59
C'est ce que je suis entrain d'essayer de capter justement.
Dans un bouquin j'ai trouvé ce truc comme attribut d'une classe qui permet de preciser au constructeur si on veut garder l'ordre naturel (donc se fier a la compareTo) ou donner une instance de Comparator pour trier selon nos criteres.
Code :
|
Deja je pige pas comment ca se lit se truc; "Un comparator de quelque chose qui est une classe mere de E" ??
Pourquoi ce joker et pas simplement <E> ????
Marsh Posté le 12-04-2005 à 15:04:37
héhéhé, erreur classique de débutant.
si tu as un Comparator<Object>, ça t'empêche pas de faire comparator.compare(new Integer(10), "10" )
(d'un point de vue types)
Simplement là, tu as besoin d'un truc capable de comparer des E entre eux. Si tu fais simplement
private Comparator<E> nameOfTheComparator;
un Comparator<Object> universel ne passerait pas (si E != Object) or ce n'est pas ce que tu voulais exprimer. Tu veux un truc qui est capable de comparer des E, et un Comparator<Object> est parfaitement cvapable de le faire, il n'y a pas de raison d'empêcher cet argument de passer.
Marsh Posté le 12-04-2005 à 16:42:44
ese-aSH a écrit : tu devrai etre prudent dans l'utilisation des generiques (je connai pas ton niveau de java mais bon) : c'est juste des astuces syntaxiques destinées a cacher la maniere dont les choses se passent reelement, avec pour consequence une perte de comprehension relative de quoi est quoi. |
bien au contraire, on fait apparaître un sens nouveau aux choses.
Marsh Posté le 12-04-2005 à 17:11:41
nraynaud => Merci !
ese-aSH => Je suis pas tres fort en Java mais je me debrouille (merci les forums et google), sinon ... la possibilité de parametrer une classe ou une methode par une autre classe c'est assez puissant enfait et comme je n'ai pas fait de choses comme ca sans la genericité j'imagine pas le merdier pour cette implementation.
Code :
|
Il y a surement quelques trucs a simplifier ou/et à optimiser (notament ma facon de chopper l'Iterator) mais sinon ca marche au top, on peut preciser son Comparator (donc ca marche meme pour les StringBuffer et autres barbares), on peut faire du for-each etc ...
Marsh Posté le 12-04-2005 à 17:20:58
pitié le melange français/anglais
Marsh Posté le 12-04-2005 à 17:24:49
Je l'avais dis qu'il y avait des choses a optimiser
Marsh Posté le 12-04-2005 à 17:49:27
ese-aSH a écrit : ben non, c'est syntaxique, derriere c'est compilé comme avant ^^ a priori les *vrais* générique seront présent dans java6 (mustang) voire meme plutot java7 (dolphin). la ca s'appelle une arnaque pour pas se faire totalement etaler par .NET =] |
une analyse d'une hauteur digne de l'EPITA.
Marsh Posté le 12-04-2005 à 18:02:20
ese-aSH a écrit : j'ai probablement fait mieux que toi niveau etudes en info :] |
ouyeah, ça casse severe ici
Marsh Posté le 12-04-2005 à 18:03:20
ese-aSH a écrit : ba regarde le code compilé |
parce que le développement ça se limite à du code compilé ?
l'inférence, la théorie des types, la qualité, la sécurité, l'analyse fonctionnelle etc.
ça compte pas ?
Marsh Posté le 12-04-2005 à 18:09:41
Ca vous dit pas de parler de généricité au lieu de vous
Marsh Posté le 12-04-2005 à 18:12:07
ese-aSH a écrit : un mec qui vient chier comme ca sur une école a base de 'moi jtemmerde j'ai fait X' |
c'est pas exactement mon propos ... mais c'est pas grave.
Par contre, qu'un mec sorte de nullepart pour dire des conneries sur un truc dont il n'a manifestement pas compris l'esprit, ça me fout hors de moi.
Marsh Posté le 12-04-2005 à 18:52:06
ese-aSH a écrit : 1)et toi tu sors d'ou ? |
1) de ton cul, biensûr (toujours élever le débat)
2) je suis mondialement connu pour ma naïveté vis-a-vis des technos, grand lecteur de 01 micro
3) rien à faire que ce soit mieux ou moins bien, c'est différent, j'ai toujours évité les comparaisons primaires comme ça sur les technos (les gens c'est différent).
4) c'est pareil avec n'importe quel outil, G. Eiffel faisait du calcul de structures maillées avec des matrices, aujourd'hui on calcule des structures non-linéaires par Newton-Raphson avec un algo d'intégration de dingue. Ben pour faire plus complexe, on a besoin d'outils plus complexes et on forme les utilisateurs.
5) non, oui.
6) non. Dans cette veine, le langage java n'est finalement qu'un sucre syntaxique puisqu'on peut écrire le .class à la main dans un éditeur exadécimal. Ensuite, toute cette affaire de MDA ou de MDC (dans les systèmes physiques) serait complètement inutile puisqu'on peut tout faire à la main. Non on a besoin sans cesse de plus d'abstraction pour continuer à faire progresser la technologie. Ensuite, le critère fort de l'implémentation par erasure a été la compatibilité avec l'existant.
Java-le-langage ne se positionne pas en terme de nombre fonctionnalités, mais en terme de simplicité (là où C# part énormément dans les fonctionnalités et les divers sucres syntaxiques pour faciliter le quotidien du développeur).
7) je vois pas le rapport, tout nouvel outil nécessite une période d'adaptation.
8) en tout cas, des choses plus réfléchies. au-revoir.
Marsh Posté le 12-04-2005 à 19:33:55
mais c'est quoi ce caca nerveux
Marsh Posté le 12-04-2005 à 19:38:43
the real moins moins a écrit : mais c'est quoi ce caca nerveux |
Y4A UN PB ?
heu ben je sais pas moi, y'a des moment où il faut s'exprimer dans la vie.
Marsh Posté le 12-04-2005 à 23:21:33
nraynaud a écrit : Y4A UN PB ? |
Ouais enfin c'est Mouinmouin qui te fait la remarque, le gars qui bondit de son siège et qui en fout 3 couches sur Blabla quand son stagiaire/collègue pond 2 lignes inutiles
Marsh Posté le 12-04-2005 à 23:29:58
en meme temps, c'est pas à son post que je faisais allusion
Marsh Posté le 12-04-2005 à 23:32:17
puisque c'est ça, j'installe mono
(je vais vérifier que winforms tourne sur quartz d'abord)
Marsh Posté le 12-04-2005 à 23:38:46
ese-aSH a écrit : ben non, c'est syntaxique, derriere c'est compilé comme avant ^^ a priori les *vrais* générique seront présent dans java6 (mustang) voire meme plutot java7 (dolphin). la ca s'appelle une arnaque pour pas se faire totalement etaler par .NET =] |
Le gars qui a rien compris aux générics dans Java
Marsh Posté le 13-04-2005 à 12:19:00
benou a écrit : |
Il n'a pas fondamentalement tord.
Il est aisé de placer dans une "list" typée des éléments d'un autres types sans lever aucune exception lors de l'execution du programme..
Java utilise le RTTI mais dans le cas des generics on passe à coté
Marsh Posté le 13-04-2005 à 12:20:42
phnatomass a écrit : Il n'a pas fondamentalement tord. |
encore un avis d'expert avisé
Marsh Posté le 13-04-2005 à 12:46:52
phnatomass a écrit : Il est aisé de placer dans une "list" typée des éléments d'un autres types sans lever aucune exception lors de l'execution du programme.. |
Tu as un exemple de code pour montrer ca ?
Marsh Posté le 13-04-2005 à 13:09:38
Voilà ce que je viens d'apprendre :
Citation : |
Bon j'ai pas tout compris ... mais j'ai l'impression que ese-aSH n'a pas tort du tout.
Schnapsman => C'est quoi le RTTI ?
EDIT : En gros c'est le compilo qui fait tout le travail pour permetres l'utilisations des generiques. Est-ce que ca veut dire que c'est juste un gadget syntaxique ???
Marsh Posté le 13-04-2005 à 13:36:22
benou a écrit : Tu as un exemple de code pour montrer ca ? |
Code :
|
Edit :
Evidemment il y a des petits warnings à la compilation
Marsh Posté le 13-04-2005 à 13:39:07
schnapsmann a écrit : encore un avis d'expert avisé |
Qui a parlé d'expertise.
Dans ce forum il y a toujours une volonté de casser le mec qui dit un truc plutot que de casser son argument.
Marsh Posté le 13-04-2005 à 13:53:06
phnatomass a écrit : Evidemment il y a des petits warnings à la compilation |
ok ... tu dis quand même tout en 2 fois
Marsh Posté le 11-04-2005 à 12:23:22
Salut, voilà j'ai quelques questions sur la généricité :
- Sachant qu'une classe fille est un sous-type de sa classe mere, pourquoi une
ArrayList<Integer> n'est pas un sous-type d'une ArrayList<Number> ? (pourtant Integer est
bien une classe fille de Number)
- Si on a une methode void f(List<? extends Figure> liste){
// Pourquoi on ne peut faire
Cercle c = list.get(0); // Cercle est supposé être un sous-type de Figure
}
- Comment interpreter "en francais" un truc du style :
<T> boolean containsAll(Collection<T> c); //le premier <T>, il sert à quoi ?
Quelqu'un pourrait il m'éclaircir svp.
Message édité par Chronoklazm le 11-04-2005 à 12:23:36
---------------
Scheme is a programmable programming language ! I heard it through the grapevine !