10
votes

Pourquoi `InstanceOf`` erreur plutôt que de retourner` False` lorsqu'il est utilisé pour 2 classes incompatibles?

Je lis ça:

http://java.sun.com/docs /books/jls/third_edition/html/expressions.html#15.20.2

Ils disent:

Considérez l'exemple programme: xxx

L'instance de l'expression est incorrecte car aucune instance de élément 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 .

Pourquoi cela entraîne-t-il une erreur, plutôt que simplement dans instance de renvoyer false?

merci,

jdelage


1 commentaires

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.


4 Réponses :


10
votes

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 :)

Cependant, il y a probablement une explication plus java-technique.


0 commentaires

3
votes

Parce que le compilateur sait que cela est impossible à un élément soit un point, vous obtenez donc une erreur de compilation.


0 commentaires

1
votes

à 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


0 commentaires

12
votes

instanceOf 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.


1 commentaires

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 résultat au moment de l'exécution.