Java règles pour la coulée
Quand certains objet d'être jeté dans un autre objet? La coulée de l'objet doivent être un sous-type de l'autre objet? Je suis à essayer de comprendre les règles...
Modifier: j'ai réalisé que je n'explique pas du tout mon problème: je suis le coulage d'un objet à un type d'interface. Cependant, au moment de l'exécution, je reçois un java.lang.ClassCastException
. Ce qui doit se passer avec mon objet, de sorte que je peux le jeter à cette interface? Faut-il mettre en œuvre?
Grâce
- Dans quelle situation avez-vous réellement besoin de convertir explicitement un objet à son type d'interface?
- Vous avez un très utile de réponse ici. Je souhaite que vous sélectionnez.
Vous devez vous connecter pour publier un commentaire.
En Java il existe deux types de variable de référence casting:
De passer: Si vous avez une référence
variable qui fait référence à un sous-type
objet, vous pouvez l'affecter à un
variable de référence du sous-type.
Vous devez faire un cast explicite de le faire
cela, et le résultat est que vous pouvez
l'accès au sous-type de membres
cette nouvelle variable de référence.
Upcasting: Vous pouvez assigner une référence
variable à un supertype de référence
variable explicitement ou implicitement.
C'est un fonctionnement intrinsèquement sûr
parce que la cession limite l'
capacités d'accès de la nouvelle
variable.
Oui, vous devez implémenter l'interface directement ou indirectement pour permettre l'assignation de votre classe de référence de l'objet pour le type d'interface.
B extends A
chatter.Supposons que nous voulons fonte d Un objet,
A A = (C)d;
Donc en interne 3 règles ont été vérifié par le Compilateur et de la machine virtuelle java.
Le compilateur vérifie les 2 premières règles au moment de la Compilation et de la JVM va vérifier dernière règle au moment de l'Exécution.
La règle 1 (moment de la Compilation, la vérification):
À la règle 2 (moment de la Compilation, la vérification):
La Règle 3 (Exception Runtime):
Trouver des exemples suivants pour obtenir plus d'idée,
Il y a un moyen intuitif de penser à ce sujet - vous n'êtes pas la modification d'un objet avec un plâtre, il vous suffit de faire quelque chose qui allait déjà être autorisée que si le type est connu - inotherwords, vous ne pouvez exprimés pour un type que votre objet ne l'est déjà. Donc il suffit de regarder vers le "haut" de la chaîne d'objet pour voir quels types s'appliquent à votre objet.
De sorte que vous pouvez lancer à une interface seulement si elle est définie quelque part plus haut dans la chaîne (par exemple, si vos classes parent met en œuvre, etc. etc.). Il doit être explicite - à partir de votre question, il semble que vous envisagez peut-être que si vous implémentez la méthode "void foo ()", alors vous devez être en mesure de lancer à une interface qui définit la méthode "void foo()" - ce qui est parfois décrit comme "duck typing" (si il charlatans comme un canard, c'est un canard) mais n'est pas la façon dont java fonctionne.
Cela fonctionne:
Mais ce ne sera pas:
Parce que même si
Bar
a unrun()
méthode qui pourrait mettre en œuvreRunnable.run()
,Bar
n'est pas déclaré à mettre en œuvreRunnable
de sorte qu'il ne peut pas être lancé àRunnable
.Java exige que vous déclarez en œuvre des interfaces par nom. Il n'a pas duck-typing, contrairement à certains autres langues, telles que Python et Aller
Vous pouvez lancer si le moteur d'exécution de type d'un objet est une sous-type de ce que vous essayez de le lancer dans.
EDIT:
Oui, l'objet que vous êtes en train de jeter devra implémenter l'interface afin de vous lancer avec succès.
Foo
comme unIBar
?Si:
Puis
est possible.