2010-10-22 9 views

Répondre

12

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

+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. –

0

Il compile mais il échouera au moment de l'exécution.

Le casting statique est une façon pour un développeur de dire au compilateur Je sais ce que je fais ici - je vais gérer moi-même la saisie de ces variables. Le compilateur ne vous empêchera pas de faire quelque chose qui lancera une exception lors de l'exécution.

+2

Mais il est clair au moment de la compilation que la distribution échouera à l'exécution, n'est-ce pas? Le compilateur m'arrête aussi en essayant de faire String bla = (String) BigDecimal.ZERO; alors pourquoi pas ici? – MRalwasser

+0

Plus exactement, il java.lang.ClassCastException. – Dave

+4

-1: En fait, il * ne * * échouera pas à l'exécution car null est compatible avec tous les types. Et la compilation * rejettera * les castes qui sont définitivement impossibles. –

0

Même chose, comme avec l'autre typecasting. Vous êtes autorisé à jeter presque n'importe quel objet à un autre. Les compilateurs ne permettent pas le typage le plus idiot (comme List to String), mais quand même - c'est à vous de regarder le typecasting. Généralement, utilisez

if(a instanceof bClass){ 
    ((bClass)a).doSomething(...); 
} 
+0

Qu'est-ce qui rend exactement un peu idiot? C'est la question? – Ishtar

+0

@Ishtar: dans le cas de List to String, il ne peut pas fonctionner car String n'implémente pas List et est final. Le JLS spécifie ce genre de chose (en le regardant maintenant ..) –

+0

@Micheal - Oui, c'est ce que je pensais aussi.Je voulais juste dire avec le commentaire, que cette réponse ne répond pas vraiment à la question: 'Pourquoi est-il permis de lancer une liste générique à son paramètre type si le paramètre est une interface mais pas une super-interface du générique?' – Ishtar