30

Uther (./29) :
en effet, pas bien réveillé ce matin

./21 > Je ne suis pas d'avis que les generics(équivalent des template C++) soient plus propre.
Je ne pense pas que les generics doivent être utilisé systématiquement pour éviter les cast.
En général c'est une bonne idée, mais pas en java. A ce que j'ai compris quand on me l'avait expliqué les generics de Java ont plutôt tendance à rajouter des casts (implicitement) qu'a en retirer comme c'est le cas en C++ ou C#.
Autant je trouve le gain des generics tout a fait appréciable dans certains cas comme pour des conteneurs ou ca fait réelement sens. Je trouve carrément pas clair dans ce genre de cas, ou on ne vois pas directement a quoi ça correspond.

Moi je serais plutôt de l'avis de Zephyr, tu fais une classe "ClasseHeritee extends ClasseDeBase<ClasseHeritee>" c'est pas la solution absolue mais au moins c'est clean du cotée de tes classes enfant. (En fait il faudrait avoir un langage avec un pseudo-type genre "ThisType" qui représenterait le type de l'instance actuelle. ça serait assez sympa et puis ça ne casserait pas les relations d'héritage ^^)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

31

GoldenCrystal (./30) :
En général c'est une bonne idée, mais pas en java. A ce que j'ai compris quand on me l'avait expliqué les generics de Java ont plutôt tendance à rajouter des casts (implicitement) qu'a en retirer comme c'est le cas en C++ ou C#.
En effet en Java les generic sont juste un système de sucre syntaxique qui masque des casts.
Dans un cas comme les conteneur, c'est un réel gain en lisibilité.
Pour moi un ClasseHeritee extends ClasseDeBase<ClasseHeritee> est quelquechose de moche, pas vraiment évident a comprendre et inutilement complexe a déclarer.
avatar

32

ah carrément, c'est juste des casts? y'a un support de la VM quand même, non?

33

squalyl (./32) :
y'a un support de la VM quand même, non?

Non, le but c'était justement de ne pas avoir à modifier la vm. Du coup tu peux utiliser des classes avec "generics" dans du Java 1.4.
So much code to write, so little time.

34

Absolument rien n'est fait au niveau de la VM.
List<Truc> list = new List<Truc>();
Truc monTruc = list.get(0);
génere le même bytecode que:
List list = new List();
Truc monTruc = (Truc)list.get(0);

C'est juste du sucre syntaxique géré par le compilateur pour rendre le code plus lisible(si bien utilisé) et empecher d'utilser une classe non cohérente (comme mettre un String dans un List<Truc>)
avatar

35

oué c'est quand même un gain important que ça teste en compile time embarrassed

36

ok. ils ont confiné ça au niveau de la sémantique, donc t'as des jolis vérifications de type en plus au niveau du compilo mais aucun overhead.

c'est sympathique smile

37

Uther (./34) :
Absolument rien n'est fait au niveau de la VM.
List<Truc> list = new List<Truc>();
Truc monTruc = list.get(0);
génere le même bytecode que:
List list = new List();
Truc monTruc = (Truc)list.get(0);

C'est juste du sucre syntaxique géré par le compilateur pour rendre le code plus lisible(si bien utilisé) et empecher d'utilser une classe non cohérente (comme mettre un String dans un List<Truc>)

Ca génère le même bytecode ? C'est dommage, le cast vers Truc est censé être sûr dans le premier cas donc on pourrait éviter la vérification de type à chaque cast sad

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

38

le cast génère un bytecode? je sais pas, malgré l'existence d'un opcode "checkcast"

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc2.html#checkcast

Pourtant le compilateur ET le vérifieur pourraient être sûrs du cast.

Donc j'ai pas testé une décompilation mais il génère pas forcément d'opcode checkcast là.

39

Bon voilà, j'ai terminé mon projet. Merci à vous, même si par manque de temps je n'aurais pas pu prendre en compte vos explications et aurait du me tourner vers d'autres solutions.

Si certains sont curieux, il est ici : tromb Fichier joint : Projet Java 2008.zip

C'est un programme qui affiche tous les chemins possibles entre deux villes.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

40

Thibaut (./28) :
Merci smile "instanceof" ça correspond à "is" en C++ (à moins que ce soit en Pascal Objet) ?

C'est un is effectivement, mais is n'est pas du C++, c'est du VB ou du Delphi.

En C++ avec QObject, c'est obj->inherits("MyClass").

Avec le RTTI C++, il me semble qu'il faut mettre if (dynamic_cast<Class *>(obj)) pour tester ça.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

41

"if (myObject is ClassA)" ou "myInstance = myObject as ClassA;" c'est quand même carrément plus classe que ces syntaxes ignobles hehe
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

42

Donc is existe en C++ ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

43

Non, c'est du C# ça.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

44

yep, ou moyennant un ":=" à la place du "=" ça pourrait être du Delphi aussi; je trouve que leurs syntaxes de cast (même si ça n'est pas quelque chose qu'on est supposé utiliser souvent) sont bien plus pratiques que "dynamic_cast<Class *>" (très lourd) ou "obj->inherits("MyClass")" (encore pire : on utilise une chaine de caractère pour la comparaison ; même si ça reflète le mécanisme interne, sémantiquement je trouve ça ignoble)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

45

je préfère le lolcode:

<variable> IS NOW A <type>         BTW equivalent to
<variable> R MAEK <variable> [A] <type>


tricol

46

#define is(t) ->inherits(#t)
if (obj is(MyClass))

smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

47

T'es pas rigoureux. Il vaut mieux mettre la définition entre parenthèses.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

48

Kevin Kofler (./46) :
#define is(t) ->inherits(#t)
if (obj is(MyClass))

smile
Certes mais c'est limité au QObject et oblige donc je pense a passer par le système QT du moc. sad

Thibaut (./47) :
T'es pas rigoureux. Il vaut mieux mettre la définition entre parenthèses.
Dans ce cas la je pense que ca serait plutôt problématique.

avatar

49

s/problématique/impossible/
Ça donnerait obj(->inherits("MyClass")), un erreur de syntaxe.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

50

Bref ton define est à proscrire tongue
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

51

Thibaut (./47) :
T'es pas rigoureux. Il vaut mieux mettre la définition entre parenthèses.

Non ça pose pas de problème, parce qu'il n'y a rien qui aurait une priorité plus élévée que ->methode() ^^ (enfin ça reste moche grin)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

52

Zephyr (./41) :
"if (myObject is ClassA)" ou "myInstance = myObject as ClassA;" c'est quand même carrément plus classe que ces syntaxes ignobles hehe

Je pensais que t'allais dire ActionScript 3.0, vu que ces deux expressions sont valables et il me semble que t'aimais bien l'AS. hehe
avatar
;)

53

Je connais pas trop l'AS 3.0, ça fait longtemps que je n'y ai pas touché, mais de mémoire les versions précédentes étaient plutôt pas mal oui ^^ (ceci dit je trouve aussi le JavaScript, à quelques exceptions près, très bien fichu)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

54

oué, le js c'est bien mais si il était un peu plus férocement typé on éviterait certains bugs chiants sorry

55

c'est surtout qu'il fonctionne en duck-typing (les notions de "fortement typé" ou "faiblement typé" me semblent toujours aussi vagues), mais bon c'est un peu le concept du langage en même temps.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

56

fortement pour moi c'est "explicite" comme C ou java

OK c est explicite mais faiblement typé.

Bon, OK, j'aime pas JS car il n'est pas explicitement typé et ça mène a pas mal de confusions.

57

En fait, les termes corrects sont plutôt typage statique et typage dynamique. Et justement dans AS 3.0 (en fait ECMAScript-262 4è édition encore en développement mais apparemment suffisamment stable pour que Macromedia base Flex dessus), il y a un support de la POO par classe en plus de la POO par prototype.
J'imagine, mais j'ai jamais lu clairement, que dans quelques temps, cette version du langage devrait aussi être adoptée par JS dans les navigateurs, et c'est pas pour me rassurer.

Pour troller, je dirais que c'est vraiment pour plaire aux noobs qui connaissent que le Java, alors que ces derniers devrait s'ouvrir un peu à d'autres concepts mais bon...
Sans troller, c'est sympa d'avoir un langage qui permet d'être totalement dynamique, et lorsque c'est vraiment nécessaire (ou pour la librairie standard après tout, tant qu'ils utilisent pas final ce qui empêche de rajouter des trucs persos à la classe String par exemple... #expérience#), pour des raisons de performance ou de complexités trop importante, de passer à du statique certains endroits précis.
En gros, quand t'es tout en statique, tu passes ton temps à coder du code qui sert à rien, qui est là juste pour faire plaisir au compilo, à la Java quoi... happy
avatar
;)

58

C++ avec MFC: if( obj->IsKindOf(RUNTIME_CLASS(MyClass))

Le as de C# correspond à dynamic_cast<> en C++ et n'a pas d'équivelent direct en java.
Le cast de Java correspond à celui du C#, ou au safe_cast<> du C++/CLI.
Le instanceof de java correspond au is du C# et n'a pas d'équivalent direct en C++, mais il ne faut pas oublier que obj is MyClass est équivalent à (obj as MyClass)!=null, d'ou l'emploi du dynamic_cast<> comme l'a montré Kevin.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.