Generische Klasse

dan1996

Aktives Mitglied
Hallo ich soll eine gegebene Klasse in eine generische Klasse umschreiben...
Aufgabe:
Schreiben Sie die obige Klasse als generische Klasse mit einem Typparameter für das Attribut item. Als Listeneinträge sollen nur Unterklassen der Klasse Number verwendet werden können.

Meine Frage ist wie ich die Methode "Summe" generisch umschreibe und welchen Typparameter ich "List" in meiner main Methode geben muss
(Ich weiß auch nicht ob meine Lösung bis jetzt überhaupt stimmt :D)
gegebene Klasse:
Code:
public class Test {
    public static void main(String[] args) {
        Liste l = new Liste();
        l.insert(0);
        l.insert(-8);
        l.insert(3);
        l.insert(-5);
        l.insert(3);

        System.out.println(l);
        System.out.println(l.summe());
    }
}
class Liste {
    private int item = -1;
    private Liste next;

    public void insert(int x) {
        Liste l = new Liste();
        if(next == null || next.item > x) {
            l.item = x;
            l.next = next;
            this.next = l;
        } else {
            next.insert(x);
        }
    }
    public String toString() {
        return next == null ? "." : " ? " + next.item + next;
    }
    
    public int summe() {
        if(next == null) {
            return 0;
        }
        int i = next.summe();
        return i + next.item;
    }
}

Meine Klasse:
Code:
public class Test {
    public static void main(String[] args) {
        Liste <T> l = new Liste<T>();  // Fehler
        l.insert(0);
        l.insert(-8);
        l.insert(3);
        l.insert(-5);
        l.insert(3);

        System.out.println(l);
        System.out.println(l.summe());
    }
}
class Liste <T extends Number & Comparable<T>>{
    
    private T item = (T) Integer.valueOf(-1);
    private Liste<T> next;

    public void insert(T x) {
        Liste<T> l = new Liste<T>();
        if(next == null || next.item.compareTo(x) > 0) {
            l.item = x;
            l.next = next;
            this.next = l;
        } else {
            next.insert(x);
        }   
    }
    public String toString() {
        return next == null ? "." : " ? " + next.item + next;
    }
    
    public int summe() {
        if(next == null) {
            return 0;
        }
        int i = next.summe();
        return i + next.item;
    }
}
 

dan1996

Aktives Mitglied
habe das jetzt so gelöst, macht das Sinn?
Sry kenne mich mit Generics noch nicht so gut aus

Code:
public class Test {
    public static void main(String[] args) {
        Liste<Integer>  l = new Liste<Integer>(); 
        l.insert(0);
        l.insert(-8);
        l.insert(3);
        l.insert(-5);
        l.insert(3);

        System.out.println(l);
        System.out.println(l.summe());
    }
}
class Liste <T extends Number & Comparable<T>>{
    
    
    private T item = (T) new Integer(-1);
    private Liste<T> next;

    public void insert(T x) {
        Liste<T> l = new Liste<T>();
        if(next == null || next.item.compareTo(x) > 0) {
            l.item = x;
            l.next = next;
            this.next = l;
        } else {
            next.insert(x);
        }   
    }
    public String toString() {
        return next == null ? "." : " ? " + next.item + next;
    }
    
    public int summe() {
        if(next == null) {
            return 0;
        }
        int i = next.summe();
        
        return i + next.item.intValue();
    }
}
 

httpdigest

Top Contributor
Als Listeneinträge sollen nur Unterklassen der Klasse Number verwendet werden können.
Code:
public int summe() {
    if (next == null) {
        return 0;
    }
    int i = next.summe();
    return i + next.item.intValue();
}
Was machst du, wenn deine Liste nicht nur eine Liste<Integer> ist, sondern Liste<Double>? Was wäre dann die int Summe von 0.2 + 0.4 ? Du willst vermutlich dann keinen int als Summe zurückgeben.
Tatsächlich kann man auch nicht T als Rückgabetyp nutzen, da man das neutrale Element 0 dann nicht erzeugt bekommt. `Integer.valueOf(0)` wäre falsch im Falle, dass T=Double ist. `Double.valueOf(0.0)` wäre falsch, im Falle, dass T=Integer ist. Dir bleibt hier nur, Number als Rückgabetyp zu verwenden. Ganz zu schweigen davon, wie man denn zwei beliebige `T`s miteinander addiert. Nutzt man hier immer number.doubleValue() und addiert das Ganze als Double? Wäre ja falsch, wenn T=Long ist, da einige Longs sich nicht als Double abbilden lassen... https://stackoverflow.com/questions/2721390/how-to-add-two-java-lang-numbers#answer-30110482 könnte weiterhelfen.
 

dan1996

Aktives Mitglied
ich danke dir
also wäre das die richtige Lösung

Code:
public Number summe() {
        if (next == null) {
            return 0;
        }
        Number i = next.summe();
        Number j = next.item;
        
        if (i instanceof Double || j instanceof Double) {
            return i.doubleValue() + j.doubleValue();
        } else if (i instanceof Float || j instanceof Float) {
            return i.floatValue() + j.floatValue();
        } else if (i instanceof Long || j instanceof Long) {
            return i.longValue() + j.longValue();
        } else {
            return i.intValue() + j.intValue();
        }
    }
 

Lyreex

Aktives Mitglied
ich danke dir
also wäre das die richtige Lösung

Code:
public Number summe() {
        if (next == null) {
            return 0;
        }
        Number i = next.summe();
        Number j = next.item;
       
        if (i instanceof Double || j instanceof Double) {
            return i.doubleValue() + j.doubleValue();
        } else if (i instanceof Float || j instanceof Float) {
            return i.floatValue() + j.floatValue();
        } else if (i instanceof Long || j instanceof Long) {
            return i.longValue() + j.longValue();
        } else {
            return i.intValue() + j.intValue();
        }
    }

Hätte das glaub ich jetzt auch so gemacht.
So castet du dir immer das passende Objekt vom Typ Number, welches du brauchst.

Könnte mir aber durchaus vorstellen, dass es noch eine Elegantere, "Allgemeinere" Lösung gibt.
So das man es nicht jedesmal in das passende Objekt casten muss.
 

mrBrown

Super-Moderator
Mitarbeiter
Wo wurde denn die Aufgabe gestellt? Vermutlich ist das im Kontext die akzeptierte Lösung...



Allerdings scheitert das wenn z.B. BigInteger benutzt wird, lösen könnte man das mit einer zusätzlich übergebenen Addier-Funktion.
 
K

kneitzel

Gast
Also diese Implementation gefällt mir nicht wirklich, denn diese suggeriert erst einmal, dass es für alle Klassen, die von Number abgeleitet wurden, funktioniert. Aber die Implementation ist eben nur für eine klare Anzahl an abgeleiteten Klassen.

Was dies etwas komplexer macht aber denkbar wäre, wäre eben die Übergabe einer Methodenreferenz, die eben zwei T als Parameter hat und ein T zurück gibt (BiFunction<T,T,T>). Das kann dann auch gerne eine Variante geben, die auf diesen Parameter verzichtet und bei bekannten Typen eben dies automatisch setzt und eine Exception wirft, wenn es kein bekannter Typ ist.

Dann wäre diese Problematik umgangen und die Generische Klasse wäre dann generell nutzbar.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methoden Generische Klasse - ändern einzelner Attributwerte Java Basics - Anfänger-Themen 2
J Probleme mit static generische Klasse Java Basics - Anfänger-Themen 6
B Generische Klasse Java Basics - Anfänger-Themen 7
F Collections Generische Klasse/Methoden Java Basics - Anfänger-Themen 19
K Generische Klasse mit innerer Klasse | Problem mit Array Java Basics - Anfänger-Themen 6
B Was passiert, wenn eine konkrete Klasse von generische Klasse erbt? Java Basics - Anfänger-Themen 14
S Parameterübergabe: Generische Klasse Java Basics - Anfänger-Themen 4
P Generische Klasse Java Basics - Anfänger-Themen 8
I Generische Funktion Java Basics - Anfänger-Themen 3
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
H Generische Konstruktor Java Basics - Anfänger-Themen 12
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
O Generische Typen Java Basics - Anfänger-Themen 9
M Generische Klassen "FlaschenRegal" Java Basics - Anfänger-Themen 13
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
J Sortierte generische Liste Java Basics - Anfänger-Themen 1
D statische generische Methoden Java Basics - Anfänger-Themen 3
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
N Generische Schnittstellen Java Basics - Anfänger-Themen 2
B generische LinkedList nach Häufigkeit der Elemente füllen Java Basics - Anfänger-Themen 6
D Generische Typen Java Basics - Anfänger-Themen 20
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
L Generische Liste Java Basics - Anfänger-Themen 4
B Generische Queue programmieren Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
A Probleme mit MergeSort Generische Liste Java Basics - Anfänger-Themen 0
A Generische Methode Java Basics - Anfänger-Themen 4
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
M Generische Liste Java Basics - Anfänger-Themen 4
B Generische Methode Java Basics - Anfänger-Themen 2
B Generische Methoden Java Basics - Anfänger-Themen 8
L Generische Warteschlange Java Basics - Anfänger-Themen 8
A Generische Datentypen Java Basics - Anfänger-Themen 8
bluerob generische ArrayList -> erbende Objekte auslesen Java Basics - Anfänger-Themen 24
L Generische Containerklasse Java Basics - Anfänger-Themen 9
V Methoden Umwandlung in generische Methode Java Basics - Anfänger-Themen 8
A Generische Collections und Vererbung Java Basics - Anfänger-Themen 2
S Generische HashMap Java Basics - Anfänger-Themen 2
M Klassen Generische Klassen, Personen und Gruppen Java Basics - Anfänger-Themen 6
L Generische ArrayList, CastProblem Java Basics - Anfänger-Themen 2
W generische Module Java Basics - Anfänger-Themen 2
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
C unterschied generische typen und supertypen als methodenparameter Java Basics - Anfänger-Themen 3
D Datentypen Generische Collections und Warnings Java Basics - Anfänger-Themen 8
F Generische Methoden Problem Java Basics - Anfänger-Themen 5
E Generische Arrays durch Typecast mit Object-Array Java Basics - Anfänger-Themen 11
B Generische Vererbung was ist der Unterschied? Java Basics - Anfänger-Themen 4
W Generische Klassen Java Basics - Anfänger-Themen 3
W Generische Klassen und Casting Java Basics - Anfänger-Themen 6
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
J array über generische arraylist Java Basics - Anfänger-Themen 7
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
N 2 dimensionale generische Arrays Java Basics - Anfänger-Themen 9
H Statische generische Methode Java Basics - Anfänger-Themen 2
G Frage zum Ungang mit Generische Datentypen Java Basics - Anfänger-Themen 4
0x7F800000 generische arrays mal wieder )-; Java Basics - Anfänger-Themen 6
D generische methode <T> void . Java Basics - Anfänger-Themen 9
J Generische Methoden Java Basics - Anfänger-Themen 6
G Doppelt verkettete, generische Liste Java Basics - Anfänger-Themen 11
S generische Felder Java Basics - Anfänger-Themen 2
C Generische Klassen, das erste Mal. Java Basics - Anfänger-Themen 8
F Generische Methode - was bringt der Wildcard Operator? Java Basics - Anfänger-Themen 7
F Generische Liste von generischen Objekten. Java Basics - Anfänger-Themen 3
H generische Methoden Java Basics - Anfänger-Themen 5
N generische HashMap und Iterator Java Basics - Anfänger-Themen 2
H generische Bausteine, heterogene Datenstrukturen Java Basics - Anfänger-Themen 2
J generische klassen neue Instanz Java Basics - Anfänger-Themen 5
H Generische Klassen. Java Basics - Anfänger-Themen 16
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
B Klasse statisch erstellen da n-mal geladen Java Basics - Anfänger-Themen 3
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
XWing Random Punkte erstellen mit der Random klasse Java Basics - Anfänger-Themen 15
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
frager2345 Optional Klasse Java Java Basics - Anfänger-Themen 2
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Klassen Typ und Intitialisierungs-Klasse, wer bestimmt was? Java Basics - Anfänger-Themen 1
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
frager2345 Java Klasse Buch verwalten Java Basics - Anfänger-Themen 0
frager2345 Java eigen Klasse zum verwalten von Büchern Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben