typecast error

Status
Nicht offen für weitere Antworten.
M

m.hyper

Gast
Hallo,

ich habe folgendes Problem, ich bekomme immer den Error :
Code:
java.lang.ClassCastException: TestA
Ich habe eine Klasse TestA von der ich via extends eine Klasse TestB ableite.
Code:
public class TestA{
public String testa = "testa";
}

public class TestB extends TestA{
public String testb = "testb";
}
und eine Funktion in KlasseC mit der ich TestA fülle:
Code:
public TestA functionAusKlasseC(){
TestA ta = new TestA();
ta.testa = "gefülltinKlasseC";
return ta;
}
Der Error kommt bei der Zeile :
Code:
testB tb = (TestB) functionAusKlasseC();

tb.testb = "hier was anderes";
System.out.println( b.testa ); //Sollte "gefülltinKlasseC" ausgeben
System.out.println( b.testb ); //Sollte "hier was anderes" ausgeben

Wie kann ich es hinbekommen, dass ich auf beide Variablen tb.testa und tb.testb zugreifen kann, ohne für TestB umständlich einen Constructor zu schreiben der mir alle Variablen etc. aus TestA initiiert?

Vielen Dank
Michael
 
A

Armitage

Gast
Du kannst nicht eine Oberklasse in eine Unterklasse konvertieren, sondern nur umgekehrt, denn TestB hat mehr Informationen als TestA.
 

merxleben

Aktives Mitglied
Hi,

m.hyper hat gesagt.:
Wie kann ich es hinbekommen, dass ich auf beide Variablen tb.testa und tb.testb zugreifen kann, ohne für TestB umständlich einen Constructor zu schreiben der mir alle Variablen etc. aus TestA initiiert?

Vielen Dank
Michael

Indem du sowohl für TestA, als auch für TestB einen Konstruktor definierst und in TestB mittels super() den Konstruktor von TestA aufrufst. Im Konstruktor von TestA werden dann alle Attribute von TestA initialisiert und im Konstruktor von TestB werden alle Attribute von TestB initialisiert.

Was ist daran so besonders umständlich

Martin

P.S.:
Bitte mach die Attribute einer Klasse entweder private oder protected und benutze Zugriffsmethoden
 
G

Guest

Gast
Gibt es den einen anderen Weg alle Informationen aus TestA in TestB zu kopieren?
 

byte

Top Contributor
Armitage hat gesagt.:
Du kannst nicht eine Oberklasse in eine Unterklasse konvertieren, sondern nur umgekehrt, denn TestB hat mehr Informationen als TestA.

Das ist so nicht ganz richtig. Generell ist das schon möglich, aber halt nicht immer.

Code:
List liste = new ArrayList();

Diese List kann ich z.b. sehr wohl nach ArrayList casten.
 

byte

Top Contributor
Anonymous hat gesagt.:
Gibt es den einen anderen Weg alle Informationen aus TestA in TestB zu kopieren?

Ich glaube Du hast den Sinn von Vererbung noch nicht verstanden. Beschäftige Dich erstmal mit den Grundlagen der OOP und Vererbung im Speziellen.
 
M

m.hyper

Gast
merxleben hat gesagt.:
Hi,

m.hyper hat gesagt.:
Wie kann ich es hinbekommen, dass ich auf beide Variablen tb.testa und tb.testb zugreifen kann, ohne für TestB umständlich einen Constructor zu schreiben der mir alle Variablen etc. aus TestA initiiert?

Vielen Dank
Michael

Indem du sowohl für TestA, als auch für TestB einen Konstruktor definierst und in TestB mittels super() den Konstruktor von TestA aufrufst. Im Konstruktor von TestA werden dann alle Attribute von TestA initialisiert und im Konstruktor von TestB werden alle Attribute von TestB initialisiert.

Was ist daran so besonders umständlich

Martin

P.S.:
Bitte mach die Attribute einer Klasse entweder private oder protected und benutze Zugriffsmethoden


Ok, aber leider habe ich nur die KlasseC die mir ein TestA zurückgibt. Die KlasseC selber will (und kann) ich nicht ändern, da sie Teil einer größeren Struktur ist. Wie bekomme ich jetzt sauber alle Informationen aus der initiierten TestA in meine jungfäuliche TestB? (Mit sauber meine ich am besten in einem Schritt)

Das muss doch irgendwie in Java gehen? (In C OOP geht sowas doch auch)

merxleben hat gesagt.:
Bitte mach die Attribute einer Klasse entweder private oder protected und benutze Zugriffsmethoden

Na klar! Aber im Beispiel erspare ich mir die Tipperei ;)
 
S

SlaterB

Gast
Code:
// Aufruf:
TestB testB = new TestB(testA);


------

// constructor TestB:
public TestB(TestA other) {
  super(other);
  if (TestB.class.isInstance(other)) {
     copyFromOtherTestB((TestB) other);
  }
}

private void copyFromOtherTestB(TestB other) {
       // copy values
}

------

// constructor TestA:
public TestA(TestA other) {
  // copy values
}
 

merxleben

Aktives Mitglied
byto hat gesagt.:
Armitage hat gesagt.:
Du kannst nicht eine Oberklasse in eine Unterklasse konvertieren, sondern nur umgekehrt, denn TestB hat mehr Informationen als TestA.

Das ist so nicht ganz richtig. Generell ist das schon möglich, aber halt nicht immer.

Code:
List liste = new ArrayList();

Diese List kann ich z.b. sehr wohl nach ArrayList casten.

ich nehme an du meinst im folgenden soetwas wie
Code:
ArraylList neueListe = (ArrayList)liste;

zugegeben, das wird funktionieren. Dort machst du aber keinen Cast von List nach ArrayList, weil liste eine Referenz auf eine Instanz der Klasse ArrayList hält. Sprich dort hast du eine Instanz der Unterklasse, und dann kannst du auch casten.

Die Aussage, dass man eine Instanz einer Oberklasse nicht in eine Instanz einer Unterklasse konvertieren oder casten kann ist richtig. Das Missverständniss beruht darauf, dass man einer Variablen einer Oberklasse eine Referenz einer Unterklasse zuweisen kann. Gleichzeitig kann ich zur Laufzeit prüfen, ob diese Variable eine Instanz der Oberklasse oder der Unterklasse enthält. Und wenn diese Variable eine Instanz einer Unterklasse enthält, dann kann man auch den Cast durchführen.

Code:
class A {
}

class B extends A {
}

A a = new B(); // funktioniert;
B b = (B)a; // geht auch, weil (a instanceof B) gilt

A a = new A(); // geht natürlich
B b = (B)a; // Fehler, da (a instanceof B) nicht gilt

Ich hoffe es wird deutlich, was ich dagen möchte

Martin
 

byte

Top Contributor
merxleben hat gesagt.:
ich nehme an du meinst im folgenden soetwas wie
Code:
ArrayList neueListe = (ArrayList)liste;

zugegeben, das wird funktionieren. Dort machst du aber keinen Cast von List nach ArrayList, weil liste eine Referenz auf eine Instanz der Klasse ArrayList hält. Sprich dort hast du eine Instanz der Unterklasse, und dann kannst du auch casten.

Wenn das Deiner Meinung nach kein Cast ist, was ist es denn dann?
 

merxleben

Aktives Mitglied
byto hat gesagt.:
merxleben hat gesagt.:
ich nehme an du meinst im folgenden soetwas wie
Code:
ArrayList neueListe = (ArrayList)liste;

zugegeben, das wird funktionieren. Dort machst du aber keinen Cast von List nach ArrayList, weil liste eine Referenz auf eine Instanz der Klasse ArrayList hält. Sprich dort hast du eine Instanz der Unterklasse, und dann kannst du auch casten.

Wenn das Deiner Meinung nach kein Cast ist, was ist es denn dann?

Vielleicht hab ich das unglücklich formuliert. Was ich sagen möchte ist, in dem obigen Beispiel erfolgt keine Konvertierung von List nach ArrayList, weil liste schon eine Instanz von ArrayList hält. Wenn ich mich da etwas missverständlich ausgedrückt habe, dann Asche auf mein Haupt.

Martin
 
S

SlaterB

Gast
Was soll denn diese Harrspalterei?
Natürlich ist das ein Cast, widerspeicht doch keiner.

Die Aussage ist schlicht, dass ein Objekt der Oberklasse nicht auf den Typ der Unterklasse gecastet werden kann.
Punkt.

Dass ein Objekt der Unterklasse, enthalten in einer Variable der Oberklasse, auf die Unterklasse gecastet werden kann, ist doch klar.
Hätte man erwähnen können aber war in diesem Moment doch nicht der entscheidene Punkt.., nur Haarspalterei.
 

merxleben

Aktives Mitglied
SlaterB hat gesagt.:
Die Aussage ist schlicht, dass ein Objekt der Oberklasse nicht auf den Typ der Unterklasse gecastet werden kann.
Punkt.

War vielleicht mein Fehler erklären zu wollen, wie man auf die gegenteilige Meinung kommen kann.
Kommt nicht wieder vor ... vielleicht jedenfalls :wink:

Martin
 

byte

Top Contributor
Nur die Ruhe, kein Grund hier gleich an die Decke zu gehen. :roll:

Ich wollte nichts anderes sagen, als dass man sowohl hoch- als auch runtercasten kann innerhalb der Vererbungshierarchie, weil ich der Meinung war, dass dies im Thread etwas mißverständlich dargestellt wurde.

Im Sinne der Polymorphie ist der von mir beschriebene Anwendungsfall imo auch wesentlich häufiger von Nutzen, als das Hochcasten auf eine Oberklasse. Ich kann mich nicht erinnern, wann ich sowas das letzte Mal machen musste, denn normalerweise ist ja eh alles nötige in der Unterklasse sichtbar. In einem perfekten Klassenentwurf sollte natürlich auch das runtercasten auf eine Unterklasse unnötig sein, aber in der Praxis ist es dann doch das eine oder andere mal nötig ohne gleich wahnwitzige Refactorings durchzuführen. ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Klassen Typecast unnötig? Allgemeine Java-Themen 2
J Typecast entfernen Allgemeine Java-Themen 7
D Datentypen Unklarheit bei Typecast / arithm. Überlauf Allgemeine Java-Themen 2
Q Typecast zwischen Klassen mit implementierter Schnittstelle Allgemeine Java-Themen 4
G IOException error 2 Allgemeine Java-Themen 3
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
S An internal error occurred during: Launching null argument Allgemeine Java-Themen 1
S Gradle "schluckt" output und error Allgemeine Java-Themen 1
Bluedaishi Access violation error Allgemeine Java-Themen 2
M Jdeps-Error durch multi-release Allgemeine Java-Themen 6
Xge For/Array Error: IndexOutOfBounds Allgemeine Java-Themen 4
S CMD Compiler Error Allgemeine Java-Themen 13
L Compiler-Fehler Eclipse Error: A JNI error has occured Allgemeine Java-Themen 3
T Eclipse IDE Plugin Error Log Allgemeine Java-Themen 0
Robat JNI - Fatal Error Allgemeine Java-Themen 5
S LinkedList Error Allgemeine Java-Themen 4
F String Error Allgemeine Java-Themen 7
K Error Allgemeine Java-Themen 2
G Error Meldung bei Gomoku Spiel Allgemeine Java-Themen 9
J LWJGL 3 Error Code 1282 Allgemeine Java-Themen 4
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
D Datentypen Cache Images Heap Space Error Allgemeine Java-Themen 7
D Java Error String kann nicht in Int umgewandelt werden Allgemeine Java-Themen 2
L Exception/Error auf JDialog umleiten Allgemeine Java-Themen 2
G Java Error (Exception_acces_violation) Allgemeine Java-Themen 2
G Java Error (Exception_acces_violation) Allgemeine Java-Themen 0
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
F Compiler-Fehler Hilfe bei Startup error Allgemeine Java-Themen 3
M List casting error Allgemeine Java-Themen 3
F Java Error, bei Installation, Start und dem Control Panal Allgemeine Java-Themen 8
A ausführbare jar Error Allgemeine Java-Themen 2
F Error Logging - best practices? Allgemeine Java-Themen 3
P JDK installieren Error: Could not find or load main class HelloWorld.java Allgemeine Java-Themen 3
D Java error Allgemeine Java-Themen 2
J JVM Launcher Error Allgemeine Java-Themen 30
Jats Programm mit CMD Befehl hängt sich auf oder gibt error = 5 aus Allgemeine Java-Themen 4
I Java Ordner kopieren [Error] Allgemeine Java-Themen 6
G OutOfMemory Error bei Zahlenkonvertierungsprogramm Allgemeine Java-Themen 5
Jats ArrayList-Error Index: 1 Size:1 - Bitte um Hilfe Allgemeine Java-Themen 36
B Fatal error der JVM Allgemeine Java-Themen 9
N xml fatal error umgehen Allgemeine Java-Themen 14
M Webservice mit Axis2 und Eclipse - Error Allgemeine Java-Themen 2
S JNI - Fatal Error Allgemeine Java-Themen 2
D Java Heap error trotz anpassungen mit -xmx Allgemeine Java-Themen 4
R VM-Error - BadWindow (invalid Window parameter) Allgemeine Java-Themen 4
F Look And Feel Error Allgemeine Java-Themen 30
B Java OutOfMemory Error verhindern, Resourcenbedarf präventiv abschätzen? Allgemeine Java-Themen 19
X Error bei der Programmierung eines Sortieralgorithmus Allgemeine Java-Themen 2
B maven 2 error bei plugin download Allgemeine Java-Themen 7
hdi Heap Sapce Error bei sehr großem String Allgemeine Java-Themen 5
D Java Error / Fehler Allgemeine Java-Themen 2
A JNI unsatisfied linker error Allgemeine Java-Themen 2
R Syntax Error, der keiner sein sollte Allgemeine Java-Themen 12
S Error aus der Konsole auslesen Allgemeine Java-Themen 2
G Text aus Zwischenablage in JTextarea -> JDBC Error Allgemeine Java-Themen 3
A Synatx Error, wo gar keiner ist ? Allgemeine Java-Themen 2
T Syntax Error Allgemeine Java-Themen 9
B JMF Installations Error Allgemeine Java-Themen 2
O java StreamCorrupted Error beim Belegen einer JTextpane Allgemeine Java-Themen 5
R Speicherprobleme (OutOfMemory Error) Allgemeine Java-Themen 26
J Fatal Error Allgemeine Java-Themen 8
G Error: Hashtable Type safety: The method put(Object, Object) Allgemeine Java-Themen 6
J "Empty-String" Error Allgemeine Java-Themen 6
W Runtime Error216 Runtime error 217 Allgemeine Java-Themen 6
J Interpreteraufruf bring Error obwohl dies nicht sein dürfte. Allgemeine Java-Themen 24
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
S Syntax Error, insert "AssignmentOperator Expression&amp Allgemeine Java-Themen 3
T Konsole "Fehlermeldung": error hereerror here Allgemeine Java-Themen 4
R Problemchen (unexpected error) Allgemeine Java-Themen 2
K error=2 (Datei nicht gefunden) - Datei ist aber da! Allgemeine Java-Themen 10
B unchecked cast Error Allgemeine Java-Themen 2
H java heap space (outofmemory error) Allgemeine Java-Themen 3
I Error: Unable to realize com.sun.media.amovie.AMController Allgemeine Java-Themen 3
M JButton verursacht einen HeapSpace Error? Allgemeine Java-Themen 6
B Syntax error on token ,VariableDeclaratorId expected after. Allgemeine Java-Themen 3
F Jar mit Abhängigkeiten ausführen -> NoClassDefFound Error Allgemeine Java-Themen 16
M strange error Allgemeine Java-Themen 3
S HTTPUnit Test Fehler: Error on HTTP request: 500 Internal Er Allgemeine Java-Themen 9
R .jar Executable - JVM Launcher: Fatal error Allgemeine Java-Themen 9
W Wie fange ich einen Error ab? Allgemeine Java-Themen 6
R Server Error 503 Allgemeine Java-Themen 4
D java.lang.error Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben