Variablen Möglich?: Cast einer Referenzvariable auf den Typ seines Objektes

Hallo,
ich hab mal folgende Frage (hab mich schon totgesucht):

Nehmen wir an ich habe eine abstrakte Oberklasse, die eine Methode hat. Diese Methode wird in den Unterklassen durch Einschubmethoden (Template Pattern) spezifiert.
Jedoch soll diese Methode (in der abstrakten Klasse) möglichst allgemein sein und damit verschiedene Objekte entgegennehmen können. Dazu sieht sie so aus:
Code:
public abstract class X{
........
  public void doSomething(Object o) {
   //hier sollte die Referenz "o" zu seinem wirklichen Typ werden. 
  //Also wenn hinter Object o ein Objekt vom Typ "Project" 
  //steht, soll der Referenztyp von o danach auch "Project" sein = Project o.
   //Abhandlung
  }
..........
}

Innerhalb der Methode sollte dann aber das "Object o" wieder seinen wirklichen Typ bekommen (also die Referenz "o" soll dann statt "Object" den Typ der Klasse haben, die hinter dieser Referenz steckt).
Google Suche und Experimente mit ".getclass().cast()" und ähnlichem haben nicht hingehauen.

Über den Sinn und Zweck bitte nicht diskutieren, der spezielle Typ wird später so in einer weiteren externen Methode benötigt.

Oder kann man hier mit Generics arbeiten (bin dort aber nich so fit drin)?
 
Zuletzt bearbeitet:
Code:
public <T extends AbstractClass> void doSomething(???? <T> o) {
So oder ähnlich muss es sicherlich sein.
Ich komme aber einfach nicht drauf, bzw. ich hab Generics noch nicht so 100%tig kapiert. Kann mir da jemand helfen? (Am besten ausnahmsweise bitte die Lösung, denn mir platzt nach dem langen Java-Tag heut gleich der Kopf). Besten Dank :)
 

mvitz

Top Contributor
Code:
public <T extends AbstractClass> void doSomething(???? <T> o) {
So oder ähnlich muss es sicherlich sein.
Ich komme aber einfach nicht drauf, bzw. ich hab Generics noch nicht so 100%tig kapiert. Kann mir da jemand helfen? (Am besten ausnahmsweise bitte die Lösung, denn mir platzt nach dem langen Java-Tag heut gleich der Kopf). Besten Dank :)

So aus dem Kopf müsste es wohl einfach

Code:
public <T extends AbstractClass> void doSomething(T o) {

sein.
 

xehpuk

Top Contributor
Was gehen würde:

Java:
public abstract class AbstractClass<T> {
    public void doSomething(T t) {
        
    }
}
Java:
public class ConcreteClass extends AbstractClass<String> {
    @Override
    public void doSomething(String s) {
        
    }
}

Vielleicht suchst du aber auch einfach nur nach dem Visitor-Pattern?
 
Danke mvitz, das scheint so weit zu funktionieren :)
Edit: Danke euch beiden. hat mir weitergeholfen. Das Visitor-Pattern benötigte ich, denke ich, auf den ersten Blick nicht. Aber ich werd es mir auf jeden Fall nochmal genauer anschauen!
:)
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Wenn du mal erklären würdest was du damit später machen willst könnte man dir sicher einen geeigneten Tipp zur Umsetzung geben. Derzeit klingt das Ganze ein wenig krude was du da machst. Für 2 oder 3 verschiedene Typen (am Besten noch mit einem gemeinsamen Interface) würde ich auch deinen Ansatz verfolgen aber für "alle möglichen Typen" ist das etwas seltsam.
 
N

nurNeFrage

Gast
Sofern ohnehin eine abstrakte Klasse existiert, verstehe ich den Unterschied zwischen
Java:
public <T extends AbstractClass> void doSomething(T o)
und
Java:
public void doSomething(AbstractClass o)
nicht.

:confused:
 

xehpuk

Top Contributor
Meines Erachtens gibt es keinen und ergibt in diesem Zusammenhang auch keinen Sinn, da Subklassen dann ebenfalls nur das machen können:
Java:
public class ConcreteClass extends AbstractClass {
	@Override
	public <T extends AbstractClass> void doSomething(T o) { // bzw. public void doSomething(AbstractClass o)
		
	}
}
Also im Prinzip nichts.

Bin daher auch etwas irritiert, dass es dem TE geholfen haben soll.
 
Tut mir Leid Leute..Ich hatte den Tag noch gemerkt, dass meine gewünschten Zielklassen (in die Object o gecastetd werden soll), gar keine Unterklasse von der abstrakten Klasse sind (war nicht mein Code; wollte diesen etwas vereinfachen durch die Idee mit den Generics).
Also wie ihr schon gesagt habt, besteht zwischen den zwei Lösugnen kein Unterschied, aber ich kann sie jetzt doch nicht so anwenden.

Aber mal davon ab: Geht es trotzdem mit irgendwelchen Tricks, dass wenn ich ein Object o in einer Methode erwarte, ich diese Referenz auf den wahren (Klassen-)Typ von o bringen kann? Ohne die Klasse (wo sich die Methode befindet) irgendwie mit dem Klassen-Typ von "o" verwandt ist?

Mit geht es darum, dass ich sonst in den Einschubmethoden die Referenz "o" auf die enstprechende Klasse casten müssten, um an dessen Methoden ranzukommen.
 
Nope, Interface geht auch nicht hehe. Die übergebenen Objekte haben alle unterschiedliche Methoden / Zwecke.
Ich caste jetzt in den Einschubmethoden auf die jeweilige Klasse. Das ist am einfachsten. Anders hätte ich natürlich vor dem Aufruf der Einschubmethode schon automatisch casten alssen können und mir das dann in den Einschubmethoden erspart. Aber das macht jetzt nichts.
Danke für die Hilfe Leute :).
 
S

SlaterB

Gast
angenommen, das was du wünschst ginge mit einem imaginären Konstrukt X,
was würde das für dich bedeuten, was hättest du davon, welchen Code würdest du damit schreiben?


Code:
public abstract class X{
........
  public void doSomething(Object o) {
   //hier sollte die Referenz "o" zu seinem wirklichen Typ werden. 
  //Also wenn hinter Object o ein Objekt vom Typ "Project" 
  //steht, soll der Referenztyp von o danach auch "Project" sein = Project o.
   //Abhandlung
  }
..........
}
wenn du ganz konkret 'Project'-Code schreiben willst, dann caste einfach auf Project, das geht,
wenn du mehrere fragliche Klassen kennst dann brauchst du auch mehreren Code, der kaum in derselben Zeile steht,
du brauchst eine Unterscheidung per if und else in verschiedene Abläufe, mit instanceof-Test und Cast wärst du wiederum gut bedient,

am ehesten noch könntest du hoffen, dass etwa bei vorhandenen Untermethoden für Typ A, B, C
ein Code
Java:
call(o);
automatisch die richtige Untermethode wählt, statt mühsamen Standardcode
Java:
if (typA) {
call( (A) o);
} else if (typB) ...
auszuprogrammieren, also nur ein Weiterreichungsproblem, kein direkter Code,
diesen Fall gibt es nicht, also keine Java-Unterstützung dazu,

für alles andere macht es schlicht keinen Sinn überhaupt etwas in der Art zu wünschen,
es ließe sich für nichts anwenden, oder noch mal gefragt: wie genau stellst du dir einen Nutzen vor?
 
Zuletzt bearbeitet von einem Moderator:
Der Nutzen sollte ganz trivial sein, nämlich dass ich mir den Cast in jeer Einschubmethode spare ;)
Ich dachte halt, dass es vllt. eine einfache Java-Implemt. dafür schon gäbe oder etwas in der Art. Da es ja nicht der Fall zu sein scheint, caste ich halt in den Einschubmethoden der jeweiligen Unterklasse.
 
S

SlaterB

Gast
> nämlich dass ich mir den Cast in jeer Einschubmethode spare

du meinst vielleicht genau das was ich schon geschrieben habe,
ansonsten kann ich darin keine Bedeutung erkennen, nur Code, eben Pseudocode, wäre hilfreich

aber muss auch absolut nicht sein, wenn Thema für dich schon beendet
 
Ich denke shcon, dass wir das gleiche verstehen. Aber hier gerne nochmal Code (hab grad keine Zeit für Pseudocode)

Code:
public abstract class AbstractClass {

    public void saveObject(Object o) {
        .....[COLOR="Red"]//Ich dachte hier hätte man einen autom. Cast von der Referenz "o" auf seinen Klassentyp machen können, der dann natürlich an die Einschubmethode "saveSpecific()" weitergeleitet wird.[/COLOR]
        
        saveSpecific(o);  //Da das anscheinend nicht geht, übergebe ich jetzt hier Object o und caste es dort in der Einschubmethode (s.u.).
        ......
    }

}
//Eine von AbstractClass erbenden Klassen
public class Project extends AbstractClass{
    @Override
    void saveSpecific(Object o) {
        Sprint p = (A) o;
         .....//speichere Sachen aus p
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
mit Generics geht übrigens folgende Richtung:
Java:
    abstract class AbstractClass<T>
    {

        abstract void saveSpecific(T t);

        void saveObject(Object o)
        {
            saveSpecific((T)o);
        }
    }

    class Project
        extends AbstractClass<Sprint>
    {

        void saveSpecific(Sprint o)
        {

        }

    }

    class Sprint
    {
    }
aber auch viel zu tippen pro Klasse, nur um einmal Cast (Sprint) zu sparen ist <Sprint> wohl kaum besser ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
C SFTP Verbindung nicht möglich Java Basics - Anfänger-Themen 4
U Ascii wert verschieben, wie möglich? Java Basics - Anfänger-Themen 3
U Sekunden von LocalTime auslesen, wie möglich? Java Basics - Anfänger-Themen 1
R Ist es möglich, ein Zahlungs-Gateway mit Java zu bauen? Java Basics - Anfänger-Themen 11
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
Y Aufruf von Methode nicht möglich. Java Basics - Anfänger-Themen 2
s.marcii Modulo in der Variable einsetzen - ist das möglich? Java Basics - Anfänger-Themen 2
J Ist es möglich einen int Array wirklich leer zu initialisieren oder zu füllen? Java Basics - Anfänger-Themen 21
P Klassenübergreifende Ausgabe mittels "getter" nicht möglich Java Basics - Anfänger-Themen 21
Z Kein überprüfen des gesamten Arrays möglich.(Viergewinnt Spiel) Java Basics - Anfänger-Themen 6
B Erste Schritte Guice Injection nicht in jeder Klasse möglich Java Basics - Anfänger-Themen 2
M Ist es möglich, das größte und zweitgrößte element in einem Array mit nur einer Schleife ausfindig zu machen ? Java Basics - Anfänger-Themen 19
N Eine Zahl solange teilen bis es nicht möglich ist und die Ergebnisse ausgeben Java Basics - Anfänger-Themen 23
G Warum ist hier ein Lamda-Ausdruck möglich Java Basics - Anfänger-Themen 2
I Druckerauflösung auslesen - mittlerweile möglich? Java Basics - Anfänger-Themen 4
Olis Erste Schritte Simples Memory Spiel möglich? Java Basics - Anfänger-Themen 1
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
S Sequenz von Zahlen bei einem Stack möglich oder nicht möglich? Java Basics - Anfänger-Themen 5
W Dezimalzahlen in Binärzahl umwandeln. Wie möglich ? Java Basics - Anfänger-Themen 9
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
K Einzelne Email verschieben nicht möglich Java Basics - Anfänger-Themen 3
H Datentypen for(typ a : b) nur typ Object möglich ? Java Basics - Anfänger-Themen 2
JavaNewbie2.0 Warum ist dies nicht möglich? Java Basics - Anfänger-Themen 7
T Input/Output Einlesen eines .txt Files nur bei gesetztem Breakpoint möglich Java Basics - Anfänger-Themen 1
M Ist es möglich den Login in eine Drittseite für den eigenen zu benutzen? Java Basics - Anfänger-Themen 1
J Java Ordner Erstellung nicht möglich. Java Basics - Anfänger-Themen 3
R Primzahl ja/nein - besserer Code möglich? Java Basics - Anfänger-Themen 2
M Eingabe im Terminal nicht möglich Java Basics - Anfänger-Themen 20
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
D Hinzufügen einer Site zur Ausnahmeliste nicht möglich Java Basics - Anfänger-Themen 1
D Liste verschiedener konkreter Klassen möglich? Java Basics - Anfänger-Themen 2
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
K Variablen Ist es möglich eine ArrayList vom Typ Array zu erstellen? Java Basics - Anfänger-Themen 2
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
A Methoden Parameter optionalisieren möglich? - Wie? Java Basics - Anfänger-Themen 19
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
M Möglich? Methode aufrufen deren Bezeichner zur Laufzeit durch einen überg. String festgelegt wird Java Basics - Anfänger-Themen 3
0 Über CMD die JAVA Datei ausführen? möglich? Java Basics - Anfänger-Themen 8
A Arrays Per For Schleife Erstellen - !Möglich? Java Basics - Anfänger-Themen 8
V Eine einfachere Variante möglich ? Java Basics - Anfänger-Themen 3
1 Mini Programm, keine Eingabe möglich.. Java Basics - Anfänger-Themen 6
J Windows Maus-Zeigerbeschleunigung aktivieren/deaktivieren - Mit Java möglich? Java Basics - Anfänger-Themen 2
C String Objekt erstellen auch ohne new() möglich? Java Basics - Anfänger-Themen 5
D String mit Integer Variablen Namen vergleichen, möglich? Java Basics - Anfänger-Themen 6
S ResultSet close() in funktion nich möglich. Java Basics - Anfänger-Themen 8
F Exportieren als ausführbare Jar-Datei unter Ubuntu nicht möglich Java Basics - Anfänger-Themen 17
K Mehrere Klassen beim JavaEditor verwenden - möglich? Java Basics - Anfänger-Themen 8
K Erste Schritte Vergleichen von Zahlen ohne mehrere if-Verzweigungen - möglich? Java Basics - Anfänger-Themen 6
S Bearbeiting von xml-Datei in src-Ordner möglich?i Java Basics - Anfänger-Themen 5
G PrintWriter each line möglich? Java Basics - Anfänger-Themen 4
B Input/Output Formatierter Text aus PDF als Array auswerten in JAVA möglich ? Java Basics - Anfänger-Themen 8
E Input/Output Deserialisierung (Manipulation der Objekte möglich?) Java Basics - Anfänger-Themen 2
J "public int x" - Zugriff von anderer Klasse (selbes Package) nicht möglich?! Java Basics - Anfänger-Themen 4
R Tippen nur beschränkt möglich Java Basics - Anfänger-Themen 5
H Panel in Variable setzen möglich? Java Basics - Anfänger-Themen 10
GianaSisters Methoden eigenes TableModel -> removeRow möglich machen Java Basics - Anfänger-Themen 30
T Generisches Feld in nicht-generischer Klasse möglich? Java Basics - Anfänger-Themen 5
H Zahlen Bilder zuordnen möglich? Java Basics - Anfänger-Themen 4
P info()-Methode mit Objektrückgabe: Konsolenausgabe möglich? Java Basics - Anfänger-Themen 8
M nach jar export keine db abfrage möglich Java Basics - Anfänger-Themen 2
S Spielfeld Ausgabe mit 2 for - Schleifen möglich ? Java Basics - Anfänger-Themen 4
K Klassen Klassen nicht möglich? Java Basics - Anfänger-Themen 8
P Klassen Instanz einer Klasse in ihrer eigenen Definition erzeugen? möglich? Java Basics - Anfänger-Themen 4
C Stringeingabe: kein Satz wegen Leerzeichen möglich Java Basics - Anfänger-Themen 3
T keine buchstaben!nur zahlen eingabe möglich Java Basics - Anfänger-Themen 48
Y .class Ausführung nicht möglich - Path lässt sich nicht ändern Java Basics - Anfänger-Themen 8
I Input/Output System.out.println formatierung? möglich? Java Basics - Anfänger-Themen 2
G Input/Output Mehrere Einlesevorgänge nicht möglich Java Basics - Anfänger-Themen 4
L Öffnen des Programms nach kompilieren nicht möglich Java Basics - Anfänger-Themen 3
ruutaiokwu final wenn immer möglich verwenden? Java Basics - Anfänger-Themen 30
T Boolean in ein Objektdatentyp casten möglich? Java Basics - Anfänger-Themen 5
H ActionListener Verbesserung möglich? (This) Java Basics - Anfänger-Themen 3
N run() methode von threads überladen möglich? Java Basics - Anfänger-Themen 5
C einfacher Link zu *.html Datei möglich? Java Basics - Anfänger-Themen 4
D Funktion mit optionalen Parametern möglich? Java Basics - Anfänger-Themen 3
Q switch case hier möglich Java Basics - Anfänger-Themen 10
D Datentypen mehrdimensionales Array meherer Typen möglich ? Java Basics - Anfänger-Themen 6
D Neues Objekt in Methode erstellen möglich? Java Basics - Anfänger-Themen 5
E "Zweigeteilte" JNLP-Datei möglich? Java Basics - Anfänger-Themen 2
capgeti Verschiedene Rückgabetypen ohne Typecast möglich? Java Basics - Anfänger-Themen 7
-horn- public static double[][][] NAME() nur per RETURN Wertrückgabe möglich? Java Basics - Anfänger-Themen 20
J Null-Pointer -> Code-Zeile ausgeben möglich? Java Basics - Anfänger-Themen 7
C Ist gleichzeitiges Lesen und Schreiben einer ArrayList möglich Java Basics - Anfänger-Themen 2
D Sichere Loginverbindungen möglich? Java Basics - Anfänger-Themen 3
A Parameter in der URL möglich? Java Basics - Anfänger-Themen 6
A In Java Ribbon GUI möglich Java Basics - Anfänger-Themen 2
L Programm so klein wie möglich machen Java Basics - Anfänger-Themen 12
G Prüfung ob GUI möglich? Java Basics - Anfänger-Themen 2
G Wieso enum Declaration nur außerhalb einer Methode möglich? Java Basics - Anfänger-Themen 9
-horn- Array mit nicht fixer Größe möglich? Nachträgliches befüllen Java Basics - Anfänger-Themen 10
J Array-Index nur als Integer möglich? Java Basics - Anfänger-Themen 15
J Ordner Passwortsichern möglich? Java Basics - Anfänger-Themen 10
H ist eine "neue Session" für Mail möglich? Java Basics - Anfänger-Themen 3
S LineNumberReader - bessere Lösung möglich? - Log4J Java Basics - Anfänger-Themen 9
A Start über Konsole nicht möglich Java Basics - Anfänger-Themen 4
X WAV conversion ist einfach nicht möglich Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben