web-dev-qa-db-fra.com

Pourquoi javac autorise-t-il certains lancers impossibles et pas d'autres?

Si j'essaie de convertir un String en un Java.util.Date, le Java compilateur détecte l'erreur. Alors pourquoi le compilateur ne signale-t-il pas ce qui suit comme une erreur?)

List<String> strList = new ArrayList<>();                                                                      
Date d = (Date) strList;

Bien sûr, la JVM lance un ClassCastException au moment de l'exécution, mais le compilateur ne le signale pas.

Le comportement est le même avec javac 1.8.0_212 et 11.0.2.

53
Mike Woinoski

5.5.1. Coulée de type de référence:

Étant donné un type de référence au moment de la compilation S (source) et un type de référence au moment de la compilation T (cible), une conversion de conversion existe de S vers T si aucune erreur de compilation ne se produit en raison des règles suivantes.

[...]

Si S est un type d'interface:

  • [...]

  • Si T est un type de classe ou d'interface qui n'est pas final, alors s'il existe un supertype X de T, et un supertype Y of S, de sorte que X et Y soient des types paramétrés de manière prouvée distincts, et que les effacements de X et Y soient identiques, a une erreur de compilation se produit.

    Sinon, le cast est toujours légal au moment de la compilation (car même si T n'implémente pas S, une sous-classe de T pourrait) .

List<String> est S et Date est T dans votre cas.

2
Oleksandr Pyrohov