Generics: Generischer Konstruktor-Aufruf?

Status
Nicht offen für weitere Antworten.

TSH

Bekanntes Mitglied
Ich möchte mit Generics arbeiten und den Code möglichst generisch halten. Dazu habe ich nun ein Interface Geschaeft und eine abstrakte Klasse AbstraktesGeschaeft, das wiederum Methoden für Baeckerei und Metzgerei kapselt:

Code:
interface Geschaeft<P extends Produkt> { 
  public P erstelleProdukt(); 
} 

interface Produkt { 
  ..
} 

class Backware implements Produkt { 
  ..
} 

class Schnitzel implements Produkt  { 
  ..
} 

class Baeckerei extends AbstraktesGeschaeft<Backware> { 
  // Methoden sollen vom abstrakten Geschäft geerbt werden, so dass
  // erstelleProdukt automatisch eine Backware erzeugt.  
} 

class Metzgerei extends AbstraktesGeschaeft<Schnitzel> { 
  // Methoden sollen vom abstrakten Geschäft geerbt werden, so dass
  // erstelleProdukt automatisch ein Schnitzel erzeugt.  
} 

abstract class AbstraktesGeschaeft<P extends Produkt> implements Geschaeft

 { 

  public P erstelleProdukt() { 
    return new P(); // !!! Fehler: Es kann keine Instanz von P erzeugt werden !!
  } 

}
Wie bereits oben beschrieben, scheitert der Ansatz im fehlenden generischen Konstruktor. Kann man das Problem irgendwie lösen?
 

TSH

Bekanntes Mitglied
OK, stimmt. Danke. Ich hab jetzt als Zwischenschritt auch noch ein AbstraktesProdukt eingeführt, um Gemeinsamkeiten von Produkten vererben zu können. Aber da es eine abstrakte Klasse ist, kann (und will) ich deren Konstruktor ja auch nicht benutzen.
Code:
interface Geschaeft<P extends Produkt> { 
  public P erstelleProdukt(); 
} 

interface Produkt { 
  .. 
} 

abstract class AbstraktesProdukt implements Produkt {

}

class Backware extends AbstraktesProdukt { 
  .. 
} 

class Schnitzel extends AbstraktesProdukt  { 
  .. 
} 

class Baeckerei extends AbstraktesGeschaeft<Backware> { 
  // Methoden sollen vom abstrakten Geschäft geerbt werden, so dass 
  // erstelleProdukt automatisch eine Backware erzeugt.  
} 

class Metzgerei extends AbstraktesGeschaeft<Schnitzel> { 
  // Methoden sollen vom abstrakten Geschäft geerbt werden, so dass 
  // erstelleProdukt automatisch ein Schnitzel erzeugt.  
} 

abstract class AbstraktesGeschaeft<P extends Produkt> implements Geschaeft

 { 

  public P erstelleProdukt() { 
    return new P(); // !!! Fehler: Es kann keine Instanz von P erzeugt werden !! 
  } 

}

Was muss ich also statt new P() aufrufen, damit jede erbende Klasse seinen Typ erzeugt?
 

TSH

Bekanntes Mitglied
Also Generics brauche ich (denke ich) auch noch aus anderen Gründen. Das oben ist ja nur ein Minimalbeispiel. Ich sollte nun also so etwas wie eine AbstrakteProduktfabrik erstellen?

Wie würde die dann aussehen bzw. müsste die dann nicht auch generisch sein, wenn sie mir je nach Fall Backwaren, Schnitzel o.ä. liefern soll?
 

tfa

Top Contributor
HoaX hat gesagt.:
einfach nicht in der abstrakten klasse machen sondern direkt in metzgerei new BratwurstMitSenf()
Das ist meiner Meinung nach die sinnvollste Lösung.

Man kann aber auch tricksen:
Code:
(Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]
Damit bekommst du Class<Schnitzel> und kannst über Reflection Objekte anlegen. Das ist aber aus verschiedenen Gründen hässlich.
 
M

maki

Gast
TSH hat gesagt.:
Also Generics brauche ich (denke ich) auch noch aus anderen Gründen. Das oben ist ja nur ein Minimalbeispiel. Ich sollte nun also so etwas wie eine AbstrakteProduktfabrik erstellen?

Wie würde die dann aussehen bzw. müsste die dann nicht auch generisch sein, wenn sie mir je nach Fall Backwaren, Schnitzel o.ä. liefern soll?
Eine abtrakte Fabrik erzeugt abstrakte Produkte, sie delegiert an konkrete Fabriken, welche konkrete Produkte erzeugen.
 

TSH

Bekanntes Mitglied
Die Klassen Backware und Schnitzel haben schon ihre eigenen Konstruktoren. Ich hab die o.g. Methode etwas vereinfacht. Jetzt schreib ich sie mal realisätsnaher. Es geht nicht darum, 1 Produkt herzustellen, sondern eine Liste von k Produkten des angestrebten Typs. Und da es für alle immer gleich ist, würd ich es gerne in das AbstrakteGeschäft verschieben:

Code:
abstract class AbstraktesGeschaeft<P extends Produkt> implements Geschaeft

 { 

  public List

 erstelleSortiment(int k) { 
    List

 liste = new ArrayList

();
    for ( int i = 1; i <= k; i++ ) {
      P produkt = ??? // Factory aufrufen? Konstruktor aufrufen? Wovon?
      liste.add(produkt);
    }
      return liste;
  } 

}
Dann erspar ich mir das Erstellen eines Sortiments in 25 Produktklassen. Ich kann auch gerne eine Abstrakte Fabrik machen, aber brauch ich dann nicht auch eine Fabrik pro Produkt-Typ?
 

TSH

Bekanntes Mitglied
Das will ich ja gerade vermeiden. Dann bräuchte ich ja eher eine "Generische" Fabrik statt einer Abstrakten Fabrik.
 

schalentier

Gesperrter Benutzer
Code:
abstract class AbstraktesGeschaeft<P extends Produkt> implements Geschaeft

 { 

  public List

 erstelleSortiment(int k) { 
    List

 liste = new ArrayList

();
    for ( int i = 1; i <= k; i++ ) {
      P produkt = createProdukt();
      liste.add(produkt);
    }
      return liste;
  } 
  protected abstract P createProdukt();

}

createProdukt dann in den Konkreten Geschaeften implementieren.

Was wuerde eigentlich passieren, wenn du in diesem Beispiel komplett auf Generics verzichten wuerdest?
 

TSH

Bekanntes Mitglied
Erstmal zwischendurch: Danke Euch allen!

schalentier hat gesagt.:
createProdukt dann in den Konkreten Geschaeften implementieren.
Das will ich doch gerade vermeiden. Für 25 Produkte 25x den selben Code? Das tut doch irgendwie weh... ;-)

schalentier hat gesagt.:
Was wuerde eigentlich passieren, wenn du in diesem Beispiel komplett auf Generics verzichten wuerdest?
Wenn ich es so mache, wie von Dir vorgeschlagen, bräuchte ich sie glaub ich wirklich nicht. Aber ich dachte, genau für solche Fälle wären Generics da: Generische Methoden für sehr ähnliche Klassen, damit man nicht alles 100x schreiben muss. Und genau so ein Fall liegt doch vor, oder?
 

TSH

Bekanntes Mitglied
maki hat gesagt.:
Wenn sich alle deine Produkte gleich verhalten, wozu überhaupt Factories/Generics?
Sie haben schon noch unterschiedliche Properties und Methoden, aber die haben nichts mit dem aktuellen Zusammenhang zu tun. Ich brauche sie an anderer Stelle.
 

schalentier

Gesperrter Benutzer
TSH hat gesagt.:
Das will ich doch gerade vermeiden. Für 25 Produkte 25x den selben Code? Das tut doch irgendwie weh... ;-)

Wenn du 25 verschieden Unterklassen von Produkt hast, musst du irgendwo 25x Code schreiben, um diese zu erzeugen, egal welche Patterns du verwenden willst (ausser du machst alles per Reflektion, allerdings rate ich dir davon ab).

TSH hat gesagt.:
Aber ich dachte, genau für solche Fälle wären Generics da: Generische Methoden für sehr ähnliche Klassen, damit man nicht alles 100x schreiben muss. Und genau so ein Fall liegt doch vor, oder?

Ich verwende Generics nur, um typisierte Listen umzusetzen. Alles andere is IMHO nur zusaetzlicher und unnoetiger Overhead (siehe dein Beispiel).
 
M

maki

Gast
>> Das will ich doch gerade vermeiden. Für 25 Produkte 25x den selben Code? Das tut doch irgendwie weh...

Dann nimm eine Factory, keine abstrakte Factory, wenn alle Produkte über den Standardkonstruktor erzeugt & initialisiert werden.

>> Sie haben schon noch unterschiedliche Properties und Methoden, aber die haben nichts mit dem aktuellen Zusammenhang zu tun. Ich brauche sie an anderer Stelle.

Nun, dann müssen trotzdem verschiedene Typen zurückgegeben werden, ob das mit einer Factory rein über Generics möglich ist..
denke da wird es "dreckig" mit Reflection.

Oder eben eine Factory Methode pro Produkttyp.
 

TSH

Bekanntes Mitglied
Hm, ok. Ich hab jetzt tatsächlich die createProdukt() Methode in das jeweilige Geschäft (Baeckerei, Metzgerei) verlagert und im Interface verlangt, dass jedes Geschäft das haben muss.

Macht wohl auch Sinn, da ich die einzelnen Produkte nach deren Erstellung sowieso noch leicht bearbeiten muss (je nach Typ). Das kann jetzt da drin geschehen. Danke Euch allen.

Ich habe gelernt, dass Generics nicht der Weisheit letzter Schluss sind ;-)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben