Weiß nich warum ich das grad nich hinkriege (vllt ist es auch einfach schon zu spät für meine Konzentration).
Folgendes Problem:
Ich habe ein Interface "Data", davon erben die Klassen "AudioData" und "ImageData".
Desweiteren habe ich nun ein generische Klasse "DataSet" die folgendermaßen aussieht:
Java:
publicclassDataSet<DextendsData>{privateD data;publicDataSet(){/* Hier möchte ich nun ein neues Objekt vom Typ D in meiner Variable this.data erstellen! */this.data =new...;}}
Wie kann ich da nun im Konstruktur (bzw sonstewo in irgendwelchen Methoden in der Klasse) eines neues Objekt vom Typ D erstellen? Füll mich grade recht doof
Dieser Hack funktioniert nur, wenn man eine Unterklasse (und zwar genau eine, sonst braucht man eine Schleife) der parametrisierten Klasse bildet (also hier DataSet).
Es ist aber wirklich ziemlich dreckig. Wir haben das mal in einem Projekt so ausprobiert (Stichwort Generic DAO), allerdings nach ein paar Tagen wieder rausgeschmissen. Wir hatten Interfaces als Typparameter D, mussten aber Instanzen der implementierenden Klassen erzeugen. Und das geht damit nicht.
Eine Lösung wäre, das Klassenobjekt Class<D extends Data> im Konstruktor zu übergeben und abzuspeichern.
Ich hätte jetzt einen Hack gebaut, dieser funktioniert allerdings nur in Verbindung mit einem Bean definierten Getter/Setter (allerdings auch mit ner Menge mehr Code verbunden - war aber spaßig )
Es gab' (gibt und wird es womöglich auch in Zukunft geben) Situationen, in denen ich mir gewünscht hätte, das man zur Laufzeit irgendwie auf die Parameter-Klasse zugreifen kann.
Diese Situation war einst eine davon. Ist aber nun insoweit Geschichte, da man hier (zur Not auch anonym) ein Objekt der Klasse, die durch "extends" beschrieben wird, einfach instanzieren kann. "data" müsste dann aber auch als "Data" deklariert werden.[highlight=java]data = new Data() {};[/highlight]
Generics sind doch eigentlich nur eine "Programmierhilfe" und zur Laufzeit wieder nur vom Typ "Object". Wenn man "<T extends Klasse>" schreibt gibt es auch genau nur einen Grund dafür, nämlich den, das man innerhalb des "Generics" die verwalteten Objekttypen in den von "extends" bestimmten Typ wandeln kann. Eine Möglichkeit direkt ein Objekt des Typs "T" zu instanzieren, hat man erst wenn das "Generic" selbst mindestens eine Instanz davon gesehen hat. Man weiss ja zur Entwicklungszeit selber kaum (bzw. gar nicht) was "T" alles werden kann.
Generics sollen in einer der folgenden Java Versionen (ehemals war es für Java 7 geplant) auch zur Laufzeit verfügbar gemacht werden wie es unter .NET auch gemacht wurde.
Alternativ wäre es eine Variante wie ich es eben beim Basteln gemacht habe. Man macht sich dabei die Art und Weise des Compilers zu nutze.
Also habe ich gesagt bei einem Bean!!! gibt mir der ReturnType des Getter den Typen des Fields an obwohl das Feld selbst als Object gehandelt wird. Ergo muss ich nur Getter und Field verknüpfen und kann instanzieren.