Les acteurs est techniquement possible. Il n'est pas facile de prouver par javac qu'il n'en est pas ainsi dans votre cas et le JLS définit effectivement ceci comme un programme Java valide, donc signaler une erreur serait incorrect.
Cela s'explique par le fait que List
est une interface. Ainsi, vous pourriez avoir une sous-classe d'une Date
qui implémente réellement List
déguisé en List
ici - et ensuite l'intégrer à Date
serait parfaitement acceptable. Par exemple :
public class SneakyListDate extends Date implements List<Foo> {
...
}
Et puis :
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
La détection d'un tel scénario n'est pas toujours possible, car elle nécessiterait des informations au moment de l'exécution si l'instance provient, par exemple, d'une méthode à la place. Et même si c'était le cas, cela demanderait beaucoup plus d'efforts au compilateur. Le compilateur n'empêche que les casts qui sont absolument impossibles parce qu'il n'y a aucun moyen pour le class-tree de correspondre du tout. Ce qui n'est pas le cas ici, comme on le voit.
Notez que le JLS exige que votre code soit un programme Java valide. Dans 5.1.6.1. Conversion de la référence de rétrécissement autorisée il est dit :
Une conversion de référence étroite existe à partir du type de référence S
au type de référence T
si todo des éléments suivants sont vrai :
- [...]
-
Un des cas suivants s'applique :
- [...]
-
S
est un type d'interface, T
est un type de classe, et T
ne nomme pas un final
classe.
Donc, même si le compilateur podría se rend compte que votre cas est en fait provablement impossible, il n'est pas autorisé à signaler une erreur car le JLS le définit comme un programme Java valide.
Il ne serait autorisé qu'à afficher un avertissement.
2 votes
Rien de spécial à propos de
List
ici.Date d = (Date) new Object();
1 votes
J'ai joué avec un arduino dernièrement. J'adorerais un compilateur qui n'accepterait pas joyeusement n'importe quel cast et qui le ferait avec des résultats totalement imprévisibles. String to integer ? C'est sûr ! Double en entier ? Oui, monsieur ! Chaîne en booléen ? Au moins celui-là devient le plus souvent faux...
0 votes
@ElliottFrisch : Il y a une relation d'héritage évidente entre Date et Object, mais il n'y a pas de relation entre Date et List. Je m'attendais donc à ce que le compilateur signale ce cast, de la même manière qu'il signalerait un cast de String à Date. Mais comme l'explique Zabuza dans son excellente réponse, List est une interface, donc le cast serait légal si
strList
était une instance d'une classe qui implémente List.0 votes
Il s'agit d'une question qui revient souvent, et je suis sûr que j'en ai déjà vu de nombreuses copies. Il s'agit en fait de la version inverse de celle qui est fortement liée : stackoverflow.com/questions/21812289/
0 votes
Cela répond-il à votre question ? Pourquoi compile-t-il en faisant un casting vers une interface sans rapport ?
1 votes
@StianYttervik -fpermissive est ce qui fait ça. Activez les avertissements du compilateur.