Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Es wurde eine abstrakte Klasse A erstellt mit den Methoden A.z() und A.y()
Eine abgeleitete Klasse heist Aa und besitzt eine weitere Methode Aa.x()
Eine weitere von A abgeleitete Klasse (Ab) besitzt die Methode Ab.w()
Das Problem:
In der zugehörigen Hauptklasse (mit der main-Fkt) soll nun ein Objekt "var" erzeugt werden, die nach Eingabe des Nutzers während der Laufzeit nun entweder vom Typ Aa oder Ab ist, jedoch in beiden Fällen var heißen soll! Das Objekt var wird im weiteren Verlauf innerhalb der main-Fkt benötigt, daher sind Initialisierungen innerhalb von Blöcken (z.B. if) nicht zielführend.
Habt ihr eine Idee, wie ich dieses Dilemma lösen kann?
public static void main(String[] args) {
A var = null;
if(benutzereingabe.equals("Aa")) {
var = new Aa();
} else {
var = new Ab();
}
var.z();
var.y();
if(var instanceOf Aa){
var.x();
} else {
var.w();
}
}
Ohne diese ifs oder Generics wird sowas nicht so einfach möglich sein (wenn man nicht wie im unteren Beispiel weitere Methoden hinzufügt). Wenn ein Objekt erstellt wird liegt dessen Typ fest. Ein Cast zwischen Typ Aa und Ab ist sowieso nicht möglich.
Möglicherweise hilft dir aber das weiter ...
Java:
public static void main(String[] args) {
A var = null;
if(benutzereingabe.equals("Aa")) {
var = new Aa();
} else {
var = new Ab();
}
var.z();
var.y();
var.callSub();
}
public abstract class A {
public void z() {}
public void y() {}
public abstract void callSub();
}
public class Aa {
public void x() {}
@Override
public void callSub() {
x();
}
}
public class Ab {
public void w() {}
@Override
public void callSub() {
w();
}
}
Das Problem ist eine Methode in einer anderen Klasse D: D.v(Aa) und D.v(Ab). Der Parameter kann entweder ein Objekt vom Typ Aa oder Ab sein (realisiert mittels Überladen der Methode v).
Deinen Vorschlag hatte ich bereits zuvor ähnlich ausprobiert:
Java:
public static void main(String[] args) {
A var = null;
if(benutzereingabe.equals("Aa")) {
var = new Aa();
} else {
var = new Ab();
}
var.z();
var.y();
D.v(var);
}
Das Problem besteht in Zeile 10 (Aufruf D.v(var)): Der Compiler sagt er erwartet eine Variable von Typ Aa/Ab, aber es liegt eine Variable von Typ A vor (also von der abstrakten Klasse!). Eine vorherige Überprüfung (in Z. 9) des Objekts auf ihre zugehörige Klasse mittels getclass() gibt jedoch die Klasse Aa bzw. Ab.
Das hat etwas mit typechecking + statischer Typ + dynamischer Typ zu tun. Wenn du so und so abfragst, welchen dynamischen Typ du gerade für deine Variable var hast musst du einen typecast drauf setzen und peng es funktioniert.
Herzlichen Dank! Das typecasting war des Pudels Kern. Manchmal sieht man den Baum im Wald nicht, da ich in der gleichen Methode eine ganzzahlige Standardzufallszahl (mittels Typecasting ) berechnen lies.