Je lis ça:
http://java.sun.com/docs /books/jls/third_edition/html/expressions.html#15.20.2
Ils disent: P>
Considérez l'exemple programme: P> blockQuote>
xxx pré> L'instance
de l'expression code> est incorrecte car aucune instance de
élément code> ou l'une de ses sous-classes possibles (aucune n'est affichée ici) pourrait éventuellement être une instance de toute sous-classe de
Point code>. P> blockQuote>
Pourquoi cela entraîne-t-il une erreur, plutôt que simplement dans
instance de code> renvoyer false? p>
merci, p>
jdelage p > p>
4 Réponses :
Je dirais, parce que vous savez à la compilation, il ne sera jamais vrai. Par conséquent, il est prudent de supposer que ce n'est pas ce que le programmeur signifiait :) p>
Cependant, il y a probablement une explication plus java-technique. P>
Parce que le compilateur sait que cela est impossible à un élément soit un point, vous obtenez donc une erreur de compilation. p>
à cause de l'arbre d'héritage. Si un hérité de B puis vous pouvez écrire une instance de B
Integer i = 3; System.out.println(i instanceof String); // compile time error System.out.println(i instanceof Number); // true System.out.println(i instanceof Object); // true
instanceOf code> Chèque est une vérification d'exécution. Le compilateur est capable de découvrir que cette condition est incorrecte lors de la compilation (beaucoup plus tôt), de sorte qu'il vous indique que c'est faux. Rappelez-vous toujours que cela échouant rapidement est une bonne pratique, cela vous fera économiser beaucoup de temps et de nerfs. P>
Merci, cela explique le rationnel pour cette décision. Il est tout à fait logique, en effet, à une erreur de compilation plutôt que d'avoir un faux code> résultat au moment de l'exécution.
On dirait que vous êtes une expérience antérieure pourrait être avec des langues qui étaient principalement des typées et principalement interprétées (ex: la plupart des bases) par opposition à fortement typées et compilées. Avec une langue principalement interprétée, presque toutes la validation de type apparaît au moment de l'exécution. Toutefois, avec des langages compilés, le compilateur est capable de faire une analyse de type "type et d'exécution d'exécution". En conséquence, s'il trouve des sentiers qui ne peuvent jamais être exécutés, il peut supprimer le code dans cette voie (c'est-à-dire une suppression du code mort). Et il génère une erreur s'il trouve une opération qui ne peut jamais réussir.