Cela n'a rien à voir avec le paramètre type. Cela fonctionne ainsi:
List<String> list = null;
Connection c = (Connection) list;
Il est possible parce que List
est un type d'interface. Il est possible que la référence de liste contienne un objet qui implémente l'interface List
et également un Connection
(quelle que soit la classe ou l'interface) et pour lequel le cast fonctionne donc.
Ainsi, puisque la distribution peut fonctionner, le compilateur le permet. Il ne rejette moulages théoriquement impossible, à savoir qui impliquent des types concrets dans des hiérarchies d'héritage distincts:
JComponent c = null;
ArrayList l = (ArrayList) c;
Vous pouvez consulter les règles exactes pour les types de moulages sont légaux au moment de la compilation dans le Java Language Specification - il est à propos de 30 lignes de loisir linguistique dense.
+1 - Mais ... * "Il ne rejettera que les lancers théoriquement impossibles ..." * basé uniquement sur les types déclarés. Par exemple, si la liste a été initialisée à une classe 'List' finale qui n'a pas implémenté ou étendu' Connection', le compilateur * still * doit l'autoriser. –