downcasting funktioniert nicht

Status
Nicht offen für weitere Antworten.

guni

Bekanntes Mitglied
Hallo,
ich schreibe gerade einen Installer, der vom Konzept her so aufgebaut ist:
  • * Installer.class implements Visitor
    * Step.class implements Visitable (hat eine Property: next)
der Visitor durchläuft die einzelnen Steps und führt pro Step eine gekapselte Operation durch.
Soweit ganz einfach; jetzt kommt die Schwierigkeit:
der Installer kann mit 2 Arten von Steps aufgerufen werden:
  • * TextualStep
    * GraphicalStep
da sich beide Steps recht ähnlich sind, werden sie beide von AnyStep abgeleitet. Genau genommen unterscheiden sich die beiden Steps nur in der accept-Methode, die in einem Fall irgendeinen Text ausgibt; im anderen Fall ein neues Fenster öffnet!
Der Installer sieht ungefähr so aus:
Code:
public class Installer implements Visitor {

	public AnyStep start;
		
	public Installer() {
		// ermittle den Start Step
	}
	
	@Override
	public void visit(AnyStep s) {
		if (s.accept(this))
			this.visit(s.getNext());
	}

}
in der Main-Methode versuche ich den Installer wie folgt aufzurufen:
Code:
	public static void main(String args[]){
		Installer i = new Installer();
		i.visit((TextualStep)i.start);
	}
das Problem: Java akzeptiert mein Casting auf den TextualStep nicht!!
Wieso?
Gibt es eine Möglichkeit hier zu casten?
Oder muss ich das anders lösen?
Wenn ja, was wäre ein sinnvoller Ansatz?

danke.
lg, guni
 

tfa

Top Contributor
Was für ein Objekt steht denn in "start"? (mal davon abgesehen, dass der Cast überflüssig ist)
 

guni

Bekanntes Mitglied
Hallo tfa,
Wie lautet denn die Fehlermeldung?
das Programm wirft eine java.lang.ClassCastException: AnyStep cannot be cast to TextualStep

Code:
Was für ein Objekt steht denn in "start"

Start ein ein Objekt der Klasse AnyStep (siehe Code im startpost)
Code:
public AnyStep start;
Ich denke schon, dass ich "start" typecasten muss; woher soll der Installer sonst wissen, ob es sich um einen TextualStep oder um einen GraphicalStep handelt?!
Code:
public class AnyStep implements Visitable {
	
	private String name;
	private String message;
	private Runner r;
	private String question;
	private String error;
	private AnyStep next;
	
	// some getters and setters here ...

	public AnyStep(String name, String message, Runner r, String question,
			String error, AnyStep next) {
		this.name = name;
		this.message = message;
		this.r = r;
		this.question = question;
		this.error = error;
		this.next = next;
	}

	@Override
	public boolean accept(Visitor v) {
		// is overriden in textual/graphical step
		return false;
	}	
}
... warum denkst du, dass der Cast überflüssig ist?!
lg, guni
 
S

SlaterB

Gast
> java.lang.ClassCastException: AnyStep cannot be cast to TextualStep

sagt eindeutig, dass AnyStep nicht nach TextualStep gecastet werden kann

da musst du nun nicht zig Zeilen Erklärungen und unwesentlichen Code posten,
was sollte denn das Visitor-Interface mit dem ganzen zu tun haben? (edit: wurde doch nicht gepostet, habe mich verschaut)

es zählt alleine die Frage, ob TextualStep von AnyStep erbt oder nicht,
und diese entscheidene Klasse TextualStep fehlt bisher
 

tfa

Top Contributor
Die Variable "start" ist vom Typ AnyStep, d.h. dass dort auch Objekte von abgeleiteten Klassen (TextualStep) abgelegt sein können. Nur wenn das der Fall ist, kannst du auch nach TextualStep casten. Ein Objekt, das direkt von der Klasse AnyStep erzeugt wurde, ist eben kein TextualStep. Casting ist hier keine Typumwandlung, sondern nur eine Zusicherung an den Compiler, dass ein bestimmtes Objekt einen bestimmten Typ hat.

Code:
Ich denke schon, dass ich "start" typecasten muss; woher soll der Installer sonst wissen, ob es sich um einen TextualStep oder um einen GraphicalStep handelt?!
An der stelle wo du castest, wird eine Methode aufgerufen, die einen AnyStep-Parameter hat. Und da sowohl TextualStep als auch GraphicalStep den Typ AnyStep haben, ist ein Casting hier überflüssig. Die Methode wird sowie aufgerufen.
 

guni

Bekanntes Mitglied
Hallo Leute,

ich schick euch mal alle (relevanten) Klassen, die ich bis jetzt so hab ... danke derweil!

Code:
public class AnyStep implements Visitable {
	
	private String name;
	private String message;
	private Runner r;
	private String question;
	private String error;
	private AnyStep next;

	// some getters and setters here

	public AnyStep(String name) {
		this.name = name;
		this.message = message;
		this.r = r;
		this.question = question;
		this.error = error;
		this.next = next;
	}

	@Override
	public boolean accept(Visitor v) {
		// is overriden in textual / graphical step
		return false;
	}	
}

Code:
public class TextualStep extends AnyStep {

	public TextualStep(String name) {
		super(name);
	}

	@Override
	public boolean accept(Visitor v) {
		Runner r = this.getRunner();
		System.out.println(this.getMessage());
		if (r != null)
			r.run();
		if (this.getError() != null)
			System.out.println(this.getError());
		if (this.getQuestion() != null)
			System.out.println(this.getQuestion());
		// should only accept if next step is not null
		return (this.getNext() != null);
	}

}

Code:
public class Installer implements Visitor {

	public AnyStep start;

		AnyStep s1 = new AnyStep("Step 1");
		AnyStep s2 = new AnyStep("Step 2");
		
		s1.setNext(s2);
		
		this.start = s1;
	}
	
	@Override
	public void visit(AnyStep s) {
		if (s.accept(this))
			this.visit(s.getNext());
	}

}

so ... ich hab euch den Code wieder ein bisschen vereinfacht und nur die Dinge gepostet, von denen ich denke, dass sie notwendig sind (ich weiß, wie es ist, sich in fremden Code einzulesen) ...

also dann. ich hoffe, dass ihr mir damit weiterhelfen könnt.

lg, guni
 

guni

Bekanntes Mitglied
... ach ja.
und hier nochmal der Aufruf:

Code:
	public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		
		Installer i = new Installer();
		i.visit((TextualStep)i.start);
		
	}

lg
 

Murray

Top Contributor
Im Installer müssen die beiden AnySteps s1 und s2 entweder TextualSteps oder GraphicalSteps sein (AnyStep könnte abstratc sein, dann würde der Compiler das schon erzwingen).
 

guni

Bekanntes Mitglied
das ist es ja! der konstruktor vom installer ist in wirklichkeit etwas komplexer aufgebaut, im prinzip aber für den grafischen Installer / den textbasierten Installer genau gleich! (ausser, dass eben verschiedene Step-Typen aufgerufen werden)

muss ich jetzt allen ernstes meinen installer 2x schreiben und in den beiden Versionen dann AnyStep einmal durch TextualStep und einmal durch GraphicalStep ersetzen?!
das macht doch keinen Sinn, oder?!

lg, guni
 
S

SlaterB

Gast
SlaterB hat gesagt.:
> java.lang.ClassCastException: AnyStep cannot be cast to TextualStep

sagt eindeutig, dass AnyStep nicht nach TextualStep gecastet werden kann
[..]
es zählt alleine die Frage, ob TextualStep von AnyStep erbt oder nicht
verdammt, da habe ich dann ja eine Laufzeitexception mit einer Compiler-Fehlermeldung verwechselt,

sorry für Spam, manchmal muss ich aber meine falschen Aussagen revidieren ;)
 

guni

Bekanntes Mitglied
kein problem :lol:
aber was heißt das jetzt für mich?
ich kann ja nicht 2 genau gleiche klassen schreiben, die sich nur im aufruf einer Variablen unterscheiden, oder?!

lg
 

Murray

Top Contributor
guni hat gesagt.:
muss ich jetzt allen ernstes meinen installer 2x schreiben und in den beiden Versionen dann AnyStep einmal durch TextualStep und einmal durch GraphicalStep ersetzen?!
Du kannst sicher auch in einer Installer-Klasse eine Fallunterscheidung einbauen; es wird aber kein Weg darum herumführen, bei der Erzeugung der Step-Instanzen deren konkreten Typ anzugeben.

Wovon soll es denn abhängen, welche Art von Steps der Installer verwenden soll?
 
S

SlaterB

Gast
und nochmal der Hinweis von tfa:
tfa hat gesagt.:
An der stelle wo du castest, wird eine Methode aufgerufen, die einen AnyStep-Parameter hat.
Und da sowohl TextualStep als auch GraphicalStep den Typ AnyStep haben, ist ein Casting hier überflüssig.
Die Methode wird sowie aufgerufen.

wieso überhaupt eine Fallunterscheidung? welchen Zweck hat das?
 

guni

Bekanntes Mitglied
hmm ... eigentlich schwebt mir vor, den Installer abstrakt zu schreiben und dann einen Textual / einen Graphical-Installer zu schreiben.
Mein Problem is wie gesagt: Installer selbst weiß nicht, ob er mit einem Textual / einem Graphical-Step aufgerufen wird. Vielleicht schreibe ich das mal so, dass je nach Kommandozeilenparameter der Textual oder der Graphical-Installer aufgerufen wird. So genau weiß ich das noch nicht!
Gibt es da jetzt echt keine Lösung, dass ich den gleichen Konstruktor mit unterschiedlichen Steps aufrufe (obwohl beide Steps ja die gleiche ParentClass haben) :bahnhof:
 

guni

Bekanntes Mitglied
@SlaterB

ok. ich probier die Situation nochmal zu beschreiben:

Ich habe einen Installer nach dem Visitor-Pattern; er besucht Steps.

Ich habe eine Klasse AnyStep die Visitable ist.
Ich habe 2 Subklassen, die sich derzeit nur in der accept Methode unterscheiden (unterschiedliche Reaktion auf den "Besuch" des Installers)

der Installer soll entweder TextualSteps oder GraphicalSteps besuchen können. Je nachdem was für eine Art Step in Main gewählt wird.

vielleicht muss ich wirklich zwei unterschiedliche Initialisierungsmethoden schreiben. :?

oder hat noch irgendwer eine bessere Idee?!
 

Murray

Top Contributor
guni hat gesagt.:
eigentlich schwebt mir vor, den Installer abstrakt zu schreiben und dann einen Textual / einen Graphical-Installer zu schreiben.
Dann könnte die konkrete Instanziierung der Steps ja durch eine (abstrakte) Methode createStep passieren, die dann in den konkreten Ausprägungen TerxtualInstaller und GraphicalInstaller entsprechend implementiert wird.
Alternativ könntest Du die Instanziierung auch auslagern:
Code:
public interface StepFactory {
  public AnyStep createStep( String name);
}


public class Installer {
  public Installer( StepFactory sf) {
     AnyStep s1 = sf.createStep( "Step 1");
     AnyStep s2 = sf.createStep( "Step 2");
  }
}

Dann muss der Code, der den Installer aufruft, eben eine passende Implementierung des StepFactory-Interface mitgeben.
 

guni

Bekanntes Mitglied
hi murray,

danke für deinen hinweis.
auch, wenn ich etwas enttäuscht bin, das ganze nicht über vererbung realisieren zu können, habe ich mir deinen hint mit dem factory-pattern mal durch den kopf gehen lassen und mein programm dann dahingehend modifiziert!
danke für die hilfestellung; so funktionierts.

lg, guni
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
G WSDL-Aufruf funktioniert nicht mehr nach Umstieg auf Maven Allgemeine Java-Themen 4
Zrebna Berechnung der Zeit funktioniert nicht wie erwartet: Date, GregorianCalendar Allgemeine Java-Themen 16
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
H do-while Schleife funktioniert nicht wie ich es möchte Allgemeine Java-Themen 7
ERlK JDA Code funktioniert nicht? Allgemeine Java-Themen 4
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
stormyark TikTakToe funktioniert nicht Allgemeine Java-Themen 10
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
boschl2000 Springerproblem-Implementierung funktioniert nicht richtig Allgemeine Java-Themen 1
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
N Regulärer Ausdruck funktioniert nicht Allgemeine Java-Themen 6
Lukas2904 Wie funktioniert ein KeyLogger? Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
I Wieso funktioniert das nich? Allgemeine Java-Themen 5
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
A Mp3 Player funktioniert nicht Allgemeine Java-Themen 0
X JNA funktioniert nicht mehr Allgemeine Java-Themen 4
bueseb84 FolderWatcher mit WatchService funktioniert nur bedingt Allgemeine Java-Themen 5
Drachenbauer Division mit Int funktioniert nicht Allgemeine Java-Themen 3
O docx-Datei erzeugung mit DocXStamper funktioniert nicht Allgemeine Java-Themen 2
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Tesseract-OCR 4.0 unter Linux funktioniert nicht Allgemeine Java-Themen 3
J Wie konkret funktioniert das Modulsystem unter Java 11? Allgemeine Java-Themen 4
J Neuronales Netz funktioniert mal und mal nicht. Allgemeine Java-Themen 3
T Umlaute in Eclipse einlesen funktioniert nicht Allgemeine Java-Themen 16
A Methodenaufruf funktioniert nicht richtig Allgemeine Java-Themen 5
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
J FTPSClient funktioniert nicht Allgemeine Java-Themen 4
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
M Operatoren Warum funktioniert diese überprüfung nicht? Allgemeine Java-Themen 7
R jar-Datei funktioniert nicht Allgemeine Java-Themen 2
E Open Declaration Funktioniert nicht Allgemeine Java-Themen 0
R Verschlüsselung funktioniert nicht Allgemeine Java-Themen 5
RalleYTN requires transitive funktioniert nicht? Allgemeine Java-Themen 7
R Bruteforce hashes mit multithreading. Funktioniert das so? Allgemeine Java-Themen 0
P Best Practice Wieso funktioniert der Modulo - Operator nicht? Allgemeine Java-Themen 2
HarleyDavidson Eigener PropertyChangeListener funktioniert einfach nicht Allgemeine Java-Themen 3
J Exclude funktioniert nicht Allgemeine Java-Themen 2
K .jar funktioniert nicht vollständig Allgemeine Java-Themen 1
P Java https proxy (-Dhttps.proxyHost) Start-Parameter funktioniert nicht? Allgemeine Java-Themen 2
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
O Fahrenheit/Celsius Converter funktioniert nicht Allgemeine Java-Themen 2
M Serialisierung funktioniert nicht Allgemeine Java-Themen 9
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
J Arrays auf gleichheit untersuchen funktioniert nicht Allgemeine Java-Themen 11
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H Timer funktioniert nicht? Allgemeine Java-Themen 3
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
J If Abfrage funktioniert nicht Allgemeine Java-Themen 4
R Objekt funktioniert nicht auf iOS Allgemeine Java-Themen 15
U PersistenceManager.createEntityManager funktioniert nicht Allgemeine Java-Themen 3
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
JG12111989 Auswertung von Fragebogen funktioniert nicht! Allgemeine Java-Themen 7
M Primzahlberechnung funktioniert nicht. Allgemeine Java-Themen 4
A JFreeChart funktioniert nicht :( Allgemeine Java-Themen 6
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
F Datei einlesen funktioniert nicht Allgemeine Java-Themen 3
A Debugger im Java-Editor funktioniert nicht Allgemeine Java-Themen 5
B DB-Zugriff einer Webanwendung funktioniert nicht mit Java 7 Allgemeine Java-Themen 2
B Web-Anwendung funktioniert mit Java 1.8, aber nicht mit Java 1.7 (auf Client) Allgemeine Java-Themen 5
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
P Wie funktioniert das Feedback eines Klicks auf eine Java GUI Allgemeine Java-Themen 10
F JTextField funktioniert nicht Allgemeine Java-Themen 6
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
S CSV Eintrag der nächsten Zeile auslesen funktioniert nicht Allgemeine Java-Themen 8
S Command funktioniert in Kommandzeile aber nicht mit ProcessBuilder bzw. Runtime.exec auf MAC Allgemeine Java-Themen 3
G Verschlüsselungsalgorythmus funktioniert nicht Allgemeine Java-Themen 2
buggy84 Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig Allgemeine Java-Themen 18
G Befehl funktioniert in Eclipse allerdings nicht in einer Jar-Datei Allgemeine Java-Themen 3
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
W getResources funktioniert nur in Eclipse, nicht in JAR Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
M exec() funktioniert nicht Allgemeine Java-Themen 1
M RC4-Chiffre (funktioniert eingeschränkt) Allgemeine Java-Themen 6
X Datentypen Dropzone.options funktioniert nicht Allgemeine Java-Themen 1
D Java funktioniert nur mit deaktivierter Grafikkarte Allgemeine Java-Themen 3
L Erste Schritte Eclipse und Lokal funktioniert - in HTML nicht! Allgemeine Java-Themen 2
K MD5 funktioniert nicht korrekt !? Allgemeine Java-Themen 9
M JAR Datei erstellen funktioniert nicht Allgemeine Java-Themen 5
Q JLabel Textausgabe funktioniert nicht Allgemeine Java-Themen 4
E SimpleDateFormat-Konvertierung funktioniert nicht Allgemeine Java-Themen 3
T Dateidownload Funktioniert nicht Allgemeine Java-Themen 4
C Wie funktioniert Projektplanung? Allgemeine Java-Themen 18
K String.replace funktioniert nicht Allgemeine Java-Themen 3
G treeMap.putall funktioniert nicht?! Allgemeine Java-Themen 2
DaniSahne96 Threads Code funktioniert nicht wie er sollte Allgemeine Java-Themen 9
S Warum funktioniert die runable -.jar nicht? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben