Variablen Datentyp erst während Laufzeit festlegen

RedGreenBlue

Mitglied
Liebe Java-Gemeinde,

Folgender Ist-Stand:
  • 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?
 
Was hast du denn genau vor?
Wo liegt das Problem?

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();
    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();
     }
}
 
Zuletzt bearbeitet:
@Joose:

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.
 
Was ich nicht verstehen kann, ist die unterschiedliche Interpretation des Objekts var. Bei der Benutzung von
Java:
System.out.println(held.getClass().getName());
in Zeile 10 wird "Aa" ausgegeben.

Ersetze ich die genannte Zeile durch
Java:
D.v(var);
gibt es beim Compilieren die folgende Fehlermeldung:

Code:
method v in class D cannot be applied to given types;
required: Aa
found: A
 
Zuletzt bearbeitet:
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.
 
@Flown:

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.

Also die funktionierende Zeile lautet:

Java:
D.v((Aa) var);
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben