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.
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 compilationT
(cible), une conversion de conversion existe deS
versT
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 supertypeX
deT
, et un supertypeY
ofS
, de sorte queX
etY
soient des types paramétrés de manière prouvée distincts, et que les effacements deX
etY
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 pasS
, une sous-classe deT
pourrait) .
List<String>
est S
et Date
est T
dans votre cas.