l'extension de la superclasse et ClassCastException
J'ai une super-classe, dont les deux méthodes que je veux remplacer. Voici mon code:
public class MyCustomClass extends SomeSuperClass {
protected MyCustomClass(params) {
super(params);
}
@Override
public void method1() {
super.method1();
/* here goes my code */
}
@Override
public void method2() {
super.method2();
/* here goes my another code */
}
J'ai quelques constructeur, qui passe SomeSuperClass objet en tant que paramètre, et ce que je vais faire:
MyCustomClass object;
/* now i have object of type SomeSuperClass,
but with my own method1() and method2() */
object = (MyCustomClass) MyCustomClass.item(blahblah);
/* eclipse suggests casting, because MyCustomClass.item()
constructor still returns SomeSuperClass object */
otherobject = OtherConstructor.object(object);
//OtherConstructor passes SomeSuperClass object
Qui semble être de droite, mais je suis de java.lang.ClassCastException dans SomeSuperClass lors de l'exécution.
si je créer SomeSuperClassObject, je perds mon surchargée méthodes.
Casting, même si il n'y a pas d'erreurs dans eclipse, l'application se bloque.
En d'autres termes, comment je peux remplacer SomeSuperClass avec mes propres méthodes, et encore obtenir SomeSuperClass objet à utiliser avec OtherConstructor?
Si c'est important, ce code est pour l'application android.
MyCustomClass.item
?il n'est pas remplacé, de sorte qu'il est (et il est vraiment, selon eclipse code adjoint) suffit d'utiliser la méthode de la superclasse
pour être pédant,
MyCustomClass.item()
n'est pas un "constructeur" ni OtherConstructor.object()
OriginalL'auteur artemy | 2010-11-23
Vous devez vous connecter pour publier un commentaire.
En règle générale, vous pouvez lancer une instance d'une sous-classe de la classe parente:
Cependant, vous ne pouvez pas convertir une instance de la super-classe sous-classe:
C'est parce qu'un
MyCustomClass
objet est également unSomeSuperClass
l'objet, mais pas tous lesSomeSuperClass
objets sontMyCustomClass
objets.Vous pouvez peut-être contourner ce avec certains modèles de conception. Java lui-même, a tendance à utiliser le Décorateur modèle beaucoup.
OriginalL'auteur Powerlord
De ce que je vois, il semble que MyCustomClass.élément(blahblah) appel renvoie quelque chose de différent (peut-être le parent) que MyCustomClass. C'est la seule partie en te code, si vous lancez un sort d'objet...
donc, c'est votre problème, vous ne pouvez pas convertir instance parent à l'enfant. L'héritage de construire peut être traduite en EST la construction du langage. Dans votre cas, vous avez un Mammifère (super-classe) et Humaines (sous-classe) et le Lapin de la sous-classe. Vous pouvez créer de l'Homme h et de dire "h EST un mammifère (Mammifère m = new Humain())", mais on ne peut pas dire que tous les Mammifères est de l'Homme (Mammifère m = new Rabit; Humaines h = (Homme) m)...et c'est ce que vous avez fait, et pourquoi vous avez la classcastexception...
comme je le regarde, vous n'avez légèrement différente erreur...vous l'avez dit, que l'Homme h = nouveau Mammifère(), mais c'est pas vrai, parce que le résumé de mammifères (votre super-classe) a 4 pattes, et l'homme a 2 mains et les 2 jambes...donc tu ne peux pas le cast de référence à la mère de l'enfant....vous pouvez faire cela seulement si le parent de référence contient l'objet enfant (Mammifère m = new Humain(); h = (Homme) m) par ce que vous dites, cet homme est un mammifère - ce béton de mammifères (coutume de travail pour tous les mammifères) est un humain.
OriginalL'auteur malejpavouk
Si le
item()
méthode est déclarée dansSomeSuperClass
, je doute qu'il soit retourner une instance deMyCustomClass
. Si votre plâtre(MyCustomClass) MyCustomClass.item(blahblah)
serait invalide.Oui, vous avez raison, il pourrait être écrit de cette manière; mais j'en doute. Je vais reformuler.
OriginalL'auteur Dave Costa
ressemble le problème est résolu. J'ai essayé
et cela a fonctionné.
BTW, quelqu'un peut-il expliquer cela?
OriginalL'auteur artemy