typage statique suxor - Java - Programmation
Marsh Posté le 09-10-2002 à 16:31:07
coin
Marsh Posté le 09-10-2002 à 16:31:50
Long n'est pas castable en String
Or c'est ce qui se passe quand tu fais ()?: je présume...
Marsh Posté le 09-10-2002 à 16:31:51
GREG ! REMETS TON MESSAGE TOUT DE SUITE !
c'est vrai quoi, de quoi j'ai l'air maintenant
Marsh Posté le 09-10-2002 à 16:32:14
lorill a écrit a écrit : GREG ! REMETS TON MESSAGE TOUT DE SUITE ! c'est vrai quoi, de quoi j'ai l'air maintenant |
ben voila il est là
Marsh Posté le 09-10-2002 à 16:33:04
lorill a écrit a écrit : GREG ! REMETS TON MESSAGE TOUT DE SUITE ! c'est vrai quoi, de quoi j'ai l'air maintenant |
j etait sur qu il avait repondu !!!
greg c pas bien d effacer tes messages
Marsh Posté le 09-10-2002 à 16:33:43
il fait ca tout le temps qd il raconte des bêtises
Marsh Posté le 09-10-2002 à 16:33:49
--greg-- a écrit a écrit : Long n'est pas castable en String Or c'est ce qui se passe quand tu fais ()?: je présume... |
?: n'a pas a caster quoi que ce soit
Marsh Posté le 09-10-2002 à 16:34:48
Et pourtant
System.out.println( (toto!=null) ? new Long(0) : toto); //ok
crotte. Pourquoi ?: demande que les deux opérandes soient du même type ?
Marsh Posté le 09-10-2002 à 16:38:28
lorill a écrit a écrit : Pourquoi ?: demande que les deux opérandes soient du même type ? |
Parceque
Marsh Posté le 09-10-2002 à 16:38:30
lorill a écrit a écrit : Et pourtant System.out.println( (toto!=null) ? new Long(0) : toto); //ok crotte. Pourquoi ?: demande que les deux opérandes soient du même type ? |
ben euh c logique nan?
MaClasseDeMonCul monInstance = (a==b) new String("pouet" ) : new InputStream("tralala" );
tu voudrais que ça marche ça?
Marsh Posté le 09-10-2002 à 16:39:18
--greg-- a écrit a écrit : tu voudrais que ça marche ça? |
Oui (smalltalk p0w4h)
Marsh Posté le 09-10-2002 à 16:41:33
kadreg a écrit a écrit : Oui (smalltalk p0w4h) |
euh ...
Marsh Posté le 09-10-2002 à 16:41:50
--greg-- a écrit a écrit : ben euh c logique nan? MaClasseDeMonCul monInstance = (a==b) new String("pouet" ) : new InputStream("tralala" ); tu voudrais que ça marche ça? |
Oui. Je trouves ca aberrant que ca ne marche pas, même apres avoir lu la spec. http://java.sun.com/docs/books/jls [...] tml#290293
Marsh Posté le 09-10-2002 à 16:42:47
lorill a écrit a écrit : Oui. Je trouves ca aberrant que ca ne marche pas, même apres avoir lu la spec. http://java.sun.com/docs/books/jls [...] tml#290293 |
euh et à quoi va ressembler l'instance de la ClasseDeTonCul comme ça
Marsh Posté le 09-10-2002 à 16:44:14
Citation : uses the boolean value of one expression to decide which of two other expressions should be evaluated |
EVALUER.
le pb ne se situe pas au niveau de l'expression elle mais au moment ou tu veux assigner une instance de Long à une variable de type String par exempe
String s = new Long("334" )
ça marchera jamais ça hein...
Marsh Posté le 09-10-2002 à 16:48:26
--greg-- a écrit a écrit : euh et à quoi va ressembler l'instance de la ClasseDeTonCul comme ça |
Code :
|
ben la je vois pas comment tu justifies le fait que ce soit illégal.
Marsh Posté le 09-10-2002 à 16:49:02
--greg-- a écrit a écrit :
|
celui la tu l'effaceras pas
Marsh Posté le 09-10-2002 à 16:53:39
lorill a écrit a écrit :
|
là je suis d'accord
Marsh Posté le 09-10-2002 à 16:54:34
lorill a écrit a écrit : celui la tu l'effaceras pas |
et? j'ai dit une connerie?
Dans ton cas tu voulais assigner un Long(toto) ou une String("" ) sur à une meme variable je te rappelle
Marsh Posté le 09-10-2002 à 16:56:27
lorill a écrit a écrit : Et pourtant System.out.println( (toto!=null) ? new Long(0) : toto); //ok crotte. Pourquoi ?: demande que les deux opérandes soient du même type ? |
En C++ c'est la même chose.
L'opérateur ternaire ? : doit renvoyer un objet d'un type bien défini. Or si tu écris toto != null ? "" : toto, ça renvoit quoi comme type ? Object ? Ca serait bizarre...
De toute manière, tu as rarement besoin d'avoir 2 objets de type différents de chaque côté du ":". Et si c'est cela que tu veux, le compilateur t'impose juste de lui dire que c'est effectivement cela que tu veux : toto != null ? (Object) "" : (Object) toto.
Le typage fort, ça permet juste une vérification automatisée de la cohérence d'une ligne de code, histoire de ne pas pouvoir ajouter des carottes à des bananes. Et désolé, mais on n'a pas trouvé beaucoup mieux pour limiter le nombre de bugs dans un programme...
Marsh Posté le 09-10-2002 à 16:56:43
Citation : et? j'ai dit une connerie? |
T'as surtout été a coté de la plaque
Citation : Dans ton cas tu voulais assigner un Long(toto) ou une String("" ) sur à une meme variable je te rappelle |
oui, a une variable de type Object. Quel crime !
Marsh Posté le 09-10-2002 à 17:00:29
lorill a écrit a écrit :
|
Marsh Posté le 09-10-2002 à 17:01:31
BifaceMcLeOD a écrit a écrit : Le typage fort, ça permet juste une vérification automatisée de la cohérence d'une ligne de code, histoire de ne pas pouvoir ajouter des carottes à des bananes. |
Typage fort différent de statique :
C - typage faible et statique
Java, C++ - typage fort et statique
Python, Ruby - typage fort et dynamique.
Bon, je pense que tu le sais très bien, mais bon.
Marsh Posté le 09-10-2002 à 17:10:01
Oui, mais le typage statique permet une exécution nettement plus rapide.
Ceci dit, Java offre aussi le support du typage dynamique, avec la Reflection API.
Note : on pourrait aussi ajouter "Ada" dans les langages à typage archi-fort statique, et "SmallTalk" dans les langages à typage fort et dynamique.
Marsh Posté le 09-10-2002 à 23:29:00
lorill a écrit a écrit :
|
nop. C'est logic aussi que ca marche pas : UneDate ne peux pas être converti en AutreDate et inversement. C'est donc tout a fait en cohérence avec la doc java :
Citation : If the second and third operands are of different reference types, then it must be possible to convert one of the types to the other type (call this latter type T) by assignment conversion (§5.2); the type of the conditional expression is T. It is a compile-time error if neither type is assignment compatible with the other type. |
Le problème c'est que le compilo cherche à déterminer le type de l'expression "a?b:c". Il ne tient pas compte de ce que tu vas en faire (en l'occurence, l'assigner une variable de type compatible avec b et c). par contre, tu peux faire ca :
Code :
|
Marsh Posté le 10-10-2002 à 07:22:01
j'ai bien compris ce que ca faisait, mais ca me surprend comme comportement. Mais en fait c'est logique, il est obligé de faire comme ca pour vérifier la validité du type a la compilation.
Marsh Posté le 10-10-2002 à 09:19:59
lorill a écrit a écrit : j'ai bien compris ce que ca faisait, mais ca me surprend comme comportement. Mais en fait c'est logique, il est obligé de faire comme ca pour vérifier la validité du type a la compilation. |
ouep
Marsh Posté le 10-10-2002 à 11:50:59
ReplyMarsh Posté le 10-10-2002 à 11:58:57
--greg-- a écrit a écrit : |
Qu'est-ce qu'il t'arrive encore ? C'est pas parce que je comprends que j'approuve
Marsh Posté le 10-10-2002 à 12:14:06
lorill a écrit a écrit : Qu'est-ce qu'il t'arrive encore ? C'est pas parce que je comprends que j'approuve |
Marsh Posté le 10-10-2002 à 12:35:41
Marsh Posté le 09-10-2002 à 16:26:31
Long toto = new Long("434" );
System.out.println(toto); //ok
System.out.println( (toto!=null) ? "" : toto.toString()); //ok
System.out.println( (toto!=null) ? "" : toto); //blam
Message édité par lorill le 09-10-2002 à 16:43:26