Selon cet article:

Contrairement à la vérification de type statique, la vérification de type dynamique peut entraîner l'échec d'un programme lors de l'exécution en raison d'erreurs de type. Dans certains langages de programmation, il est possible d'anticiper et de récupérer de ces pannes - soit par la gestion des erreurs, soit par une mauvaise sécurité de type. Dans d'autres, les erreurs de vérification de type sont considérées comme fatales.

Java est un exemple où les erreurs de vérification de type sont fatales. Pourquoi Java (et peut-être la plupart des langages typés statiques) est-il si strict qu'il échoue à l'exécution si une erreur de type se produit? Supposons que vous transposiez l'objet A (type réel int) pour taper Object, et que vous descendiez en String. La vérification au moment de la compilation réussira, mais la vérification du type d'exécution échouera avec une exception fatale. Cela semble dur, car ce n'est pas comme un illegalArgumentException où le programme ne peut pas littéralement continuer (un cast invalide perd la sécurité de type mais ne devrait pas être impossible). Il me semble que la situation la plus optimale serait de lancer un avertissement puis d'échouer fatalement si vous essayez d'appeler, par exemple, la String méthode indexOf sur l'objet entier. Y a-t-il une raison pour laquelle Java ne parvient pas à continuer lors de l'exécution lors de la tentative d'exécuter cette conversion non valide?

3
rb612 1 janv. 2016 à 08:19

3 réponses

Meilleure réponse

Java est un exemple où les erreurs de vérification de type sont fatales.

Non ça ne l'est pas. Vous pouvez les attraper.

Pourquoi Java (et peut-être la plupart des langages typés statiques) est-il si strict qu'il échoue à l'exécution si une erreur de type se produit?

Parce que c'est ce que signifie «typage statique»; idem 'typage strict'.

Disons que vous transposez l'objet A (type réel int) pour taper Object et que vous descendez en String. La vérification au moment de la compilation réussira, mais la vérification du type d'exécution échouera avec une exception fatale.

Non, ce ne sera pas le cas. Il échouera avec un RuntimeException. non coché

Cela semble dur, car ce n'est pas comme une illégaleArgumentException où le programme ne peut littéralement pas continuer (un cast invalide perd la sécurité de type mais ne devrait pas être impossible).

Mais c'est impossible. Le casting ne peut pas continuer. La façon dont le code objet est généré le suppose.

Il me semble que la situation la plus optimale serait de lancer un avertissement

Il jette un RuntimeException.

puis échouent fatalement si vous essayez d'appeler, par exemple, la méthode String indexOf sur l'objet entier.

Eh bien, ça ne fait pas ça.

Y a-t-il une raison pour laquelle Java ne parvient pas à continuer lors de l'exécution lors de la tentative d'exécuter cette conversion non valide?

L'implémentation est conçue autour du fait que l'exception se produit.

5
Marquis of Lorne 1 janv. 2016 à 06:40

Ce n'est pas fait comme ça parce qu'il n'y a aucun avantage à ce que vous suggérez.

Si vous aviez du code qui pouvait continuer à fonctionner dans ces situations, alors votre code est mauvais et superflu, car le cast n'était pas vraiment nécessaire, car vous ne faites rien de spécifique avec ce type.

En règle générale, les langages ne sont pas conçus pour gérer du code inutile.

Il y a de nombreux inconvénients, notamment les performances: il ne serait pas possible de compiler efficacement du code machine dans un langage qui fait ce que vous décrivez.

Les langages à typage statique sont généralement plus rapides que les langages à typage dynamique, car la connaissance du type à l'avance permet de nombreuses optimisations qui ne seraient pas possibles autrement.

Tout ce que vous suggérez rendrait le langage typé dynamiquement.

2
Erwin Bolwidt 1 janv. 2016 à 05:53

Je pense que la raison est de s'assurer que le programmeur peut localiser le problème et le résoudre, en s'assurant que le logiciel est correct. Si vous ignorez un problème de casting jusqu'à ce que vous déréféreniez, il se peut qu'il soit trop loin pour revenir facilement.

1
Ken Slade 1 janv. 2016 à 05:26