Hilfe bei Generics

Diskutiere Hilfe bei Generics im Java Basics - Anfänger-Themen Bereich.
B

beta20

Hallo,

Ich habe bisher noch nicht wirklich mit Generic gearbeitet und benötige hier etwas Hilfe:

Ich habe folgendes Problem:
Ich habe eine Methode:

Java:
String generateHtml(List<DocumentPosition> invoicePositions)
...
// Andere Methode aufrufen umd String zu generieren...
  String result = getTableBody(invoicePositions));
Hier die andere Methode
Java:
<T> String getTableBody(List<T> listValues)
Innerhalb der oberen Methode möchte ich nun eine andere Methode aufrufen, welches mir die Zahlen (von den verschiedenen Atttributen in listValues den Wert zurük gibt (Wert ist in double, aber ich benötige als Rückgabewert ein String):
String calculateAll(List<T> list);

Hier mein Versuch, aber ich komme hier nicht weiter, ob und wie ich dann wieder ein "DocumentPosition" Objekt bekomme? Der Cast funktioniert nicht, hier bekomme ich einen Compiler Fehler
Java:
/**
     * Wert errechnen
     */
    public String calculateAll(List<T> list) {
       
        List<DocumentPosition> resultList = (List<DocumentPosition>) list;
        double result = getTotalTaxValue(list);

         ....
    }
   
    /**
     * Calculate TaxValue
     */
    public double getTotalTaxValue(List<DocumentPosition> list) {
        return list.stream().mapToDouble(DocumentPosition::getTaxValue).sum();
    }
Danke für jede Hilfe
 
T

thecain

Wieso List<T> als Parameter, wenn du eigtl ein DocumentPosition willst? Das macht doch gar keinen Sinn.
 
T

temi

Kannst du nicht als Parameter gleich eine List<DokumentPosition> übergeben?
Java:
String generateHtml(List<DocumentPosition> invoicePositions) {
    
    // ..
    String result = calculateAll(invoicePositions);
}

String calculateAll(List<DocumentPosition> aList) {
    // ..
}
 
B

beta20

Ja im Prinzip würde das gehen, aber <T> String getTableBody(List<T> listValues) ist so global, dass auch andere Listen übergeben werden können.

Beispiel1:
-> Liste bestehend aus DocumentPosition

Beispiel2:
-> Liste bestehend aus Mitarbeiter (also anstatt DocumentPosition, dann "Employee")
 
A

affot

Aber dann kriegst du doch in diesem Fall direkt einen Laufzeitfehler wenn der Cast nicht funktioniert?
 
B

beta20

Ja, das brauche ich dort dann natürlich nicht...
Ich müsste davor eben wieder prüfen, von welcher Klasse listValues stammt und dann wiederum in die entsprechende Berechnungsklasse gehen?
 
A

affot

Also ich denke du solltest überlegen, wie du die Eigenschaften von der Listenelemente sinnvoll zusammenfassen kannst, und dann den generischen Parameter beschränken, also List<T extends XXX> mit XXX die passende Superklasse oder ein Interface.
Dann brauchst du aber auch Typsicherheit, also du kannst nicht casten wenn es bei der Hälfte der möglichen Parameter nicht funkioniert. Falls das nicht anders geht solltest du nicht alle möglichen Listen durch diese eine Methode jagen sondern klar beschränken.
 
T

thecain

Die Methode generateHtml sollte auch nicht die totalTaxValue berechnen. Das würde sauber strukturiert ausserhalb geschehen. Dann hättest du auch das Problem mit den Generics nicht.
 
T

temi

Die Methode generateHtml sollte auch nicht die totalTaxValue berechnen. Das würde sauber strukturiert ausserhalb geschehen. Dann hättest du auch das Problem mit den Generics nicht.
Da hast du den Nagel auf den Kopf getroffen! Das gehört nicht in die Zuständigkeit dieser Methode. Es geht anscheinend um die Erstellung eines Rechnungsformulars oder in der Art.

Eine hypothetische Klasse könnte also so aussehen:
Java:
class HtmlGenerator {
    public String generateHead(); // Titel Rechnung, Kunde, Rechnungsnummer, usw.
    public String generateListHead(); // Spaltenüberschriften o.ä.
    public String generateList(); // Rechnungspositionen
    public String generateListFoot(); // Gesamtsumme, Steuer usw.
    public String generateFoot(); // Bankverbindung usw.
}
Und jede dieser Methoden bekommt die für ihre Arbeit erforderlichen Daten (in einem dafür passenden Datentyp, z.B. HeaderData, ListHeaderData, usw.) übergeben, wobei die Aufgabe jeweils nur ist, diese Daten in HTML einzubetten. Keine Berechnung.

EDIT: Oder es gibt sogar separate Klassen für jede dieser Aufgaben: HtmlHead, HtmlListHead, HtmlList, usw.
 
Zuletzt bearbeitet:
B

beta20

Ja, so in etwa habe ich das auch schon aufgebaut.

Ich habe verschiedene Tabellenarten:
- Postionstabelle (also dann später für Angebote, Rechnungen etc.)
- Mitarbeitertabelle (Eine Tabelle, die eine Übersicht liefert, welcher Mitarbeiter für ein Projekt geplant ist)
- usw....

Was meinst du genau mit übergeben? Welche Parameter sollten die Methoden haben: generateHead(); etc. ?
Insbesondere bei generateList() würde mich das interessieren.... Wie übergebe ich dann hier Positionen oder die Mitarbeiter, sodass das global gehalten wird und ich nicht String generateList(Position position, Employee employee....) übergebe?

Was bei mir ebenfalls noch in den Methoden passiert, dass ich die Platzhalter mit den richtigen Daten ersetze.
 
T

temi

Was meinst du genau mit übergeben? Welche Parameter sollten die Methoden haben: generateHead(); etc. ?
Insbesondere bei generateList() würde mich das interessieren.... Wie übergebe ich dann hier Positionen oder die Mitarbeiter, sodass das global gehalten wird und ich nicht String generateList(Position position, Employee employee....) übergebe?
Ohne genauere Informationen ist das nicht so einfach zu sagen.

Für Head könnte man sich eine Klasse HeadData vorstellen
Java:
class HeadData {
    private String titel;
    private String subtitel;
    private Adress adress;
    // .. was halt so in einem Kopf steht.
}
Das Problem bei verschiedenen Tabellen ist ja, das auch die Spaltenanzahl und Spaltenbedeutung variabel sind. Du könntest dir also eine Klasse ListItem erstellen, aus der die Methode generateList() sich die benötigten Informationen herausholen kann, die sie braucht um einen entsprechende Liste zu generieren, also z.B. getCols() (Spaltenanzahl), getValue(int col) (Text in einer bestimmten Spalte). Das reicht eigentlich schon, um n Werte hintereinander in eine Zeile auszugeben.

public String generateList(List<ListItem> items) {}
 
Thema: 

Hilfe bei Generics

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben