2010-11-23 12 views
3

Ich habe eine Oberklasse, welche zwei Methoden ich überschreiben möchte. Hier ist mein Code:Erweiterung Oberklasse und ClassCastException

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 */ 
} 

ich einige Konstruktor haben, die SomeSuperClass Objekt als Parameter übergibt, und dem, was ich als nächstes tun:

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 

Das scheint richtig zu sein, aber ich bin immer java. lang.ClassCastException in SomeSuperClass während der Ausführung.

Wenn ich SomeSuperClassObject erstellen, verliere ich meine überschriebenen Methoden.

Mit Casting, auch wenn es keine Fehler in der Finsternis gibt, stürzt die Anwendung ab. Mit anderen Worten, wie kann ich SomeSuperClass mit meinen eigenen Methoden überschreiben, und immer noch SomeSuperClass Objekt mit OtherConstructor verwenden? Wenn es wichtig ist, ist dieser Code für Android App.

+3

Was ist der Code für 'MyCustomClass.item'? – Powerlord

+0

es ist nicht überschrieben, so ist es (und es ist wirklich, nach Eclipse-Code-Assistenten) einfach superclass Methode – artemy

+0

zu pedantisch zu verwenden, 'MyCustomClass.item()' ist kein "Konstruktor" noch "OtherConstructor.object() ' –

Antwort

0

Wenn die item() Methode in SomeSuperClass deklariert ist, bezweifle ich, dass es eine Instanz MyCustomClass zurückgibt. Ihre Besetzung (MyCustomClass) MyCustomClass.item(blahblah) wäre also ungültig.

+0

warum nicht? Wenn er beide Klassen zur Kompilierzeit hat, kann die statische Methode item() in parent die spezifische Unterklasseninstanz zurückgeben (wie bei einer Art einfacher Factory-Methode) ... – malejpavouk

+0

Ja, Sie haben Recht, dass es so geschrieben werden könnte ; aber ich bezweifle es eher. Ich werde es anders formulieren. –

15

Als allgemeine Regel gilt, können Sie eine Instanz einer Unterklasse zu seiner übergeordneten Klasse werfen:

MyCustomClass object = new MyCustomClass(params); 
SomeSuperClass superClass = (SomeSuperClass) object; 

Sie können jedoch nicht eine Instanz einer übergeordneten Klasse zu einer Unterklasse werfen:

SomeSuperClass object = new SomeSuperClass(params); 
MyCustomClass customClass = (MyCustomClass) object; // throws ClassCastException 

Dies liegt daran, dass ein MyCustomClass Objekt auch ein SomeSuperClass Objekt ist, aber nicht alle SomeSuperClass Objekte sind MyCustomClass Objekte.

Sie können dies möglicherweise mit bestimmten Entwurfsmustern umgehen. Java selbst neigt dazu, die Decorator pattern viel zu verwenden.

+0

Ich vergesse immer, welche Richtung in Ordnung ist. Das hilft. –

0

Von was ich sehe es scheint, dass MyCustomClass.item (blahblah) Aufruf etwas anderes (vielleicht die Eltern) als MyCustomClass zurückgibt. Es ist der einzige Teil in Te-Code, wo Sie Objekt werfen ...

+0

Ja, es gibt SomeSuperClass -Objekt – artemy

+0

zurück, so dass Ihr Problem ist, können Sie übergeordnete Instanz nicht an das Kind übergeben. Inheritness-Konstrukt kann in IS-Sprachkonstrukt übersetzt werden. In Ihrem Fall haben Sie eine Unterklasse Mammal (Oberklasse) und Human (Unterklasse) und Rabbit.Du kannst menschliches h erschaffen und sagen "h IST ein Säugetier (Mammal m = new Human())", aber du kannst nicht sagen, dass jedes Säugetier menschlich ist (Säugetier m = neuer Rabit; Mensch h = (Mensch) m) ... und das ist, was du getan hast, und warum du die Klassenkassexzeption hast ... – malejpavouk

+0

als ich es betrachte, hast du einen etwas anderen Fehler gemacht ... du hast gesagt, dass Mensch h = neues Säugetier(), aber das ist nicht wahr, weil abstrakt Säugetier (deine Oberklasse) hat 4 Beine, und Mensch hat 2 Hände und 2 Beine ... also kannst du keine Referenz auf das Elternteil zum Kind werfen .... du kannst das nur tun, wenn die Elternreferenz das Kindobjekt enthält (Säugetier m = new Human(); Mensch h = (Mensch) m) - damit sagen Sie, dieser Mensch ist ein Säugetier - dieses konkrete Säugetier (arbeitet nicht für jedes Säugetier) ist ein Mensch. – malejpavouk

0

sieht aus wie Problem gelöst. Ich versuchte

object = new MyCustomClass(blahblah); 

und es funktionierte. BTW, kann jemand das erklären?