Object var;
apfelsine hat gesagt.:Hallo,
...Hintergrund ist, das nicht bekannt ist, welcher Datentyp an...
So würde ich das auch lösen.Reality hat gesagt.:Du kannst ja mehrere Konstruktoren oder Methoden erstellen mit verschiedenen Parametern bzw. Typen. Die richtig Methode wird dann automatisch aufgerufen.
Thorsten hat gesagt.:In Java sind ALLE Objekte von Object vererbt. Also kannst du immer mit Object
arbeiten.
meez hat gesagt.:Thorsten hat gesagt.:In Java sind ALLE Objekte von Object vererbt. Also kannst du immer mit Object
arbeiten.
Bringt einfach nichts, da du dann auch nur die Methoden von Object verwenden kannst...
Zeig malEs gibt auch noch einen unerklärlichen Effekt beim vererben, mit dem man
so einen cast-Filter realisieren kann. Bei Interesse kann ich es zeigen
import java.util.Vector;
public class Cast
{
private static Vector vec;
private static mnSprites mySprite;
private static mnMusic myMusic;
private static mnObject myObject;
public static void main(String[] args)
{
mySprite = new mnSprites("grafik");
myMusic = new mnMusic("musik");
vec = new Vector();
vec.add(mySprite);
vec.add(myMusic);
for (int i = 0; i<2; i++)
{
myObject = (mnObject) vec.get(i);
myObject.castIntoOwnClass(myObject);
}
}
}
public abstract class mnObject
{
public mnObject()
{
}
public abstract void castIntoOwnClass(mnObject myObject);
}
public class mnMusic extends mnObject
{
String Inhalt;
public mnMusic(String Inhalt)
{
this.Inhalt = Inhalt;
}
public void castIntoOwnClass(mnObject myObject)
{
mnMusic myMusic = (mnMusic) myObject;
workWithIt(myMusic);
}
private void workWithIt(mnMusic myMusic)
{
System.out.println(myMusic.Inhalt);
}
}
public class mnSprites extends mnObject
{
String Inhalt;
public mnSprites(String Inhalt)
{
this.Inhalt = Inhalt;
}
public void castIntoOwnClass(mnObject myObject)
{
mnSprites mySprite = (mnSprites) myObject;
workWithIt(mySprite);
}
private void workWithIt(mnSprites mySprite)
{
System.out.println(mySprite.Inhalt);
}
}
private String castTo = "Integer";
Integer bla = (castTo) meinVector.get(n)
MammutsknochenAusAstrakan hat gesagt.:>Im Prinzip darf dieser Code nicht funktionieren.
warum? Stichwort polymorhie
>> Aber man kann es schon ahnen: Wenn man Objekte zum Beispiel per XML
hä? was ist das?
>>auf die Festplatte schreibt, dann speichert auch den
>>Objekttyp mit. Java weiß also intern, welches Objekt von welchen Typ ist.
willkommen in der Java welt
>> Schade, dass es dann kein casten per Variable in Java gibt, also:
>> castTo = "Integer"; Integer bla = (castTo) meinVector.get(n)
total derangiert, so eine Funktion wäre in Java definitv sinnlos, weil links
"Integer bla" steht, muss rechts sowieso Integer stehen
Sorry das Problem versteh ich nicht... Die methode get liefert natürlich den Typ Object zurück weil die Klasse Collection keine Ahnung hat was für Objekte reingesteckt werden. Beim ausführen aber ist Java klar was für ein Datentypo verwendet wird - auch sonst wären die generelle Verwendung von Interfaces / abstrakten Klasse unsinnig ?!Thorsten hat gesagt.:Der Vector liefert mit der get-Methode aber einen Rückgabewert
Object. Nun caste ich diesen in mnObject. mnObject ist aber abstrakt.
mnObject hat im Prinzip keine Ahnung, ob er nun mit mnMusic oder
mnSprite weiter machen soll.
Woher soll er das wissen?
Aber er weiß es eben doch... merkwürdiger weise... .
muss nicht try / catch sein - instanceof ginge auch. Aber du könntest einen delimiter schreiben oder die Objekte in eine Collection oder Map z.b. packen und dann die Collection / Map schreiben - dann ersparst du dir das komplizierte lesen....Thorsten hat gesagt.:Wenn ich die Objekte dieser Klassen in eine Datei schreibe, muss ich sie
als Object schreiben.
Beim lesen hab ich dann ein Problem:
Wie weiß ich jetzt, was für ein Objekt ich habe? Inventar? Spieler? ...
Da wäre es schon interessant das Cast-Ziel dynamisch zu wählen.
Mit tray-catch könnte man dann das richtige Ziel schnell finden.
deathbyaclown hat gesagt.:muss nicht try / catch sein - instanceof ginge auch. Aber du könntest einen delimiter schreiben oder die Objekte in eine Collection oder Map z.b. packen und dann die Collection / Map schreiben - dann ersparst du dir das komplizierte lesen....Thorsten hat gesagt.:Wenn ich die Objekte dieser Klassen in eine Datei schreibe, muss ich sie
als Object schreiben.
Beim lesen hab ich dann ein Problem:
Wie weiß ich jetzt, was für ein Objekt ich habe? Inventar? Spieler? ...
Da wäre es schon interessant das Cast-Ziel dynamisch zu wählen.
Mit tray-catch könnte man dann das richtige Ziel schnell finden.
instanceof ist vor allem programmiertechnisch besser als zig exceptions handlings..Thorsten hat gesagt.:Super :toll: instanceof war mir noch unbekanntDas muss ich mir merken :wink:
Was ist ein Delimiter?
Wie weiß ich jetzt, was für ein Objekt ich habe? Inventar? Spieler? ...
Da wäre es schon interessant das Cast-Ziel dynamisch zu wählen.
Mit tray-catch könnte man dann das richtige Ziel schnell finden.