Werte einer Generic LinkedList zusammenrechenen

o1o1oo111o

Mitglied
Hallo. Ich habe eine Aufgabe bekommen eine Methode zu implementieren die LinkedList von beliebigen typen entgegennimmt. Falls der Typ der Liste int ist, dann sollen die Werte summiert werden, ansonsten soll -1 ausgegeben werden. Meine frage ist wie ich die werte von einem Generic Type zusammenrechnen kann?
Soweit bin ich gekommen. Könnte mir jemand weiterhelfen? Wäre sehr nett :)

Java:
    public static void main(String[] args) {
        List <Integer> intListe = new LinkedList<>();
        intListe.add(2);
        intListe.add(2);
        intListe.add(4);
        intListe.add(5);
        

        List <String> strListe = new LinkedList<>();
        strListe.add("Hallo");


        System.out.println(listensumme(intListe));
        System.out.println(listensumme(strListe));


    }

    public static <T> int listensumme(List<T> liste){
        if(liste.get(0) instanceof Integer) {
            
            for (Iterator it = liste.iterator(); it.hasNext();) //Hier ist mein Problem
                T i += ((T)it.next());
                return i;
            }

        }
        return -1;
    }
 

Flown

Administrator
Mitarbeiter
Wie würdest du ohne Generics (ergo der Typ T ist immer Integer) eine Summe bilden mit einer Schleife?
 

o1o1oo111o

Mitglied
Ich hätte es so gemacht:

Java:
List <Integer> intListe = new LinkedList<>();
        intListe.add(2);
        intListe.add(2);
        intListe.add(4);
        intListe.add(5);


        Integer i = 0;
        for (Iterator<Integer> it = intListe.iterator(); it.hasNext();) {
             i += it.next();
        }
        System.out.println(i);
 

httpdigest

Top Contributor
Da Java/JVM für Generics Type Erasure verwendet, gibt es kein statisches oder dynamisches Dispatch basierend auf dem Typargument eines generischen Typs. Du kannst also z.B. keine zwei Methoden haben:
Java:
public static void doSomethingWith(List<Integer> intList) {...}
public static void doSomethingWith(List<String> stringList) {...}
Du kannst hier nur Reflection (oder instanceof) verwenden, um den aktuellen Typ eines Objektes in der Liste auf Integer zu prüfen.
 

Flown

Administrator
Mitarbeiter
Der Ansatz war ja gar nicht mal schlecht. Bring jetzt deinen ersten Versuch und die Summierung zusammen (Tipp: der Cast auf (T) ist falsch du weißt ja schon, dass es ein Integer ist - ergo kannst du darauf casten)
 

o1o1oo111o

Mitglied
Der Ansatz war ja gar nicht mal schlecht. Bring jetzt deinen ersten Versuch und die Summierung zusammen (Tipp: der Cast auf (T) ist falsch du weißt ja schon, dass es ein Integer ist - ergo kannst du darauf casten)

Ich habe es mit Type <Integer> versucht jedoch kommt da ein fehler, dass Iterator vom Type <T> sein muss:
Java:
    public static <T> int listensumme(List<T> liste){

        if(liste.get(0) instanceof Integer) {
            Integer i = 0;
            for (Iterator<Integer> it = liste.iterator(); it.hasNext();) {  //Hier Fehler
                i += it.next();
                return i;
            }

        }
        return -1;
    }

Ich habe versucht Type von Iterator auf <T> zu wechseln, da kommt jedoch auch eine Fehler, dass man Integer und <T> nicht zusammenrechenn kann:
Code:
    public static <T> int listensumme(List<T> liste){

        if(liste.get(0) instanceof Integer) {
            Integer i = 0;
            for (Iterator<T> it = liste.iterator(); it.hasNext();) {
                i += it.next();  //Hier Fehler
                return i;
            }

        }
        return -1;
    }

Und Zuletzt habe ich versuch die Variable zum summieren auf Type <T> zu setzen aber ich kann der kein int wert zuweisen:

Code:
    public static <T> int listensumme(List<T> liste){

        if(liste.get(0) instanceof Integer) {
            <T> i = 0; //Hier Fehler
            for (Iterator<T> it = liste.iterator(); it.hasNext();) {
                i += it.next();
                return i;
            }

        }
        return -1;
    }
}


Komme nicht drauf obwohl ich wahrscheinlich nah an der Lösung bin. Hättest du noch Tipps für mich?
 

temi

Top Contributor
Noch ein Hinweis (nicht relevant für das Problem):
Java:
Integer i = 0; // Integer ist ein Referenztyp
for (...) {  
    i += it.next(); // deshalb wird hier bei jeder Addition ein neues Objekt erzeugt

}
Das kann bei großen Listen Laufzeitrelevanz haben. Verwende für "i" lieber den Wertetyp "int".
 

temi

Top Contributor
Du könntest auch die "enhanced for-loop" verwenden:
Java:
int i = 0;
for (int value : intListe) {
    i += value;
}

Und du könntest dafür die ganze Liste casten (Typ) list, was natürlich schief geht, wenn die Liste keine Elemente "Typ" enthält.
 
Zuletzt bearbeitet:

o1o1oo111o

Mitglied
Du könntest auch die "enhanced for-loop" verwenden:
Java:
int i = 0;
for (int value : intListe) {
    i += value;
}

Und du könntest dafür die ganze Liste casten (Typ) list, was natürlich schief geht, wenn die Liste keine Elemente "Typ" enthält.
Wie sollte ich das in einer Generic methode machen?

Java:
    public static <T> int listensumme(List<T> liste){

        if(liste.get(0) instanceof Integer) {
            int i = 0;
            for (int v : liste) {
                i += v;

            }
        return i;
        }
        return -1;
    }

Das funktioniert nicht
 

temi

Top Contributor
Wie sollte ich das in einer Generic methode machen?
Siehe diesen Hinweis:
Und du könntest dafür die ganze Liste casten (Typ) list, was natürlich schief geht, wenn die Liste keine Elemente "Typ" enthält.
Und zwar direkt hier:
Java:
for (int v : liste) {
Java:
for (int value : (List<Integer>)list) {

oder du verwendest T als Typ und castest später:
Java:
for (T value : list) {
    i += (int)value;
}
 
Zuletzt bearbeitet:

o1o1oo111o

Mitglied
Siehe diesen Hinweis:

Und zwar direkt hier:
Java:
for (int v : liste) {
Java:
for (int value : (List<Integer>)list) {

oder du verwendest T als Typ und castest später:
Java:
for (T value : list) {
    i += (int)value;
}
Danke sehr! Ich wusste nicht dass man eine Liste mit (List<Integer>) Catens muss. :)
 

temi

Top Contributor
Ich wusste nicht dass man eine Liste mit (List<Integer>) Catens muss
Du möchtest ja in deiner Methode behaupten, dass der Typ T einem bestimmten Typen entspricht, nämlich Integer und diese "Behauptung" ist der Cast. Den generischen Typen T kannst du ja nicht einfach addieren, es könnte sich um alles mögliche handeln. Und du musst auch nicht die ganze Liste casten, sondern kannst auch das einzelne T casten, wie oben geschrieben.
 

MarvinsDepression

Bekanntes Mitglied
Zur Typbestimmung habe ich mal eine Frage: Gibt es da einen universellen Weg, festzustellen, ob T gerade für Integer steht.
Ich meine, nur weil ein Cast zu int/Integer geglückt ist, heißet es ja nicht, dass der ursprüngliche Typ nicht irgend ein anderer konvertierbarer Zahlentyp war.
Mit instanceof käme ich auch nicht weiter, wenn die Liste leer ist und somit keine vergleichbare Instanz zur Verfügung steht.
Da stehe ich gerade auf dem Schlauch.
 

httpdigest

Top Contributor
Reification von Typargumenten ist nur möglich, wenn das Typargument in einer Typdeklarationen vorkommt.
Da dein <T> aber lediglich ein Typparameter an einer Methode ist, gibt es zur Laufzeit keinerlei Möglichkeit mehr (wegen der erwähnten "Type Erasure").

Anders sähe es aus bei etwa:
Java:
import java.lang.reflect.ParameterizedType;
import java.util.List;
public class MeineKlasse<T> {
  public void test(List<T> liste) {
    ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
    System.out.println(pt.getActualTypeArguments()[0]); // <- gibt "class java.lang.Integer" aus
  }
  public static void main(String[] args) {
    new MeineKlasse<Integer>() {}.test(null); // <- man achte auf die geschweiften Klammern!!!
  }
}
Hier ist es möglich, auf das konkrete Typargument des Typparameters zuzugreifen, weil aus der generischen Klasse eine Unterklasse mit Typargument erzeugt wird.

Übrigens ist genau das auch ein Trick, der von vielen Serialisierungs/Deserialisierungs-Libraries via GSON oder Jackson angewendet wird: Es wird eine Subklasse von einer generischen Klasse mit konkretem Typargument erzeugt. Das macht daraus dann einen "reifizierbaren" Typ und man bekommt die Typargument zur Laufzeit per Reflection heraus.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
K need help ; Werte aus einer Datei auslesen Allgemeine Java-Themen 4
T Amplitude-Werte aus einer Musikdatei "auslesen" Allgemeine Java-Themen 2
M Felder + Werte einer Klasse auslesen Allgemeine Java-Themen 6
L Werte aus einer Datei auslesen Allgemeine Java-Themen 18
C In DefaultTableModel nachträglich Werte einfügen Allgemeine Java-Themen 2
rosima26 Unterschiedliche Werte bei return/print Allgemeine Java-Themen 12
berserkerdq2 Kann man in IJVM maximal 3 Werte im Stack haben? Allgemeine Java-Themen 3
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Arif Math.cos liefert komische Werte Allgemeine Java-Themen 8
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
Henrithebegiinerofjava Erste Schritte Werte in Eingabefelder einlesen und wiederholen lassen. Allgemeine Java-Themen 3
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
J Swing UIManager Werte Allgemeine Java-Themen 6
4 Java 2 ArrayListen Werte herauslesen/übernehmen Allgemeine Java-Themen 4
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
KeVoZ_ int Werte in einen String fassen Allgemeine Java-Themen 4
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
B Übergebene Werte in Gerätedatei schreiben Allgemeine Java-Themen 2
M Exceltabelle in Java erstellen und Werte einlesen Allgemeine Java-Themen 32
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
R Int werte vergleichen und Anzahl Paare ausgeben Allgemeine Java-Themen 4
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
R kann man irgendwie mit Arrays mit Eingabefenstern und Schleifen Werte abklappern? Allgemeine Java-Themen 2
L Windows CMD werte Parsen. Allgemeine Java-Themen 2
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
R Variablen per HSSF geheime Werte von JAVA an EXCEL Allgemeine Java-Themen 2
ARadauer Checksumme über BigDecimal Werte Allgemeine Java-Themen 11
C Datentypen Enum-Werte Bestanteil von anderem Enum Allgemeine Java-Themen 8
Q GregorianCalendar Methode add liefert komische Werte Allgemeine Java-Themen 3
BRoll Image RGB Werte auslesen und vergleichen Allgemeine Java-Themen 8
Madlip Variablen 3 Werte aus ArrayList und weiter ... Allgemeine Java-Themen 4
M Aus Excel Tabelle lesen und Werte in Array speichern Allgemeine Java-Themen 15
A String Array Werte in neues String Array übernehmen Allgemeine Java-Themen 5
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
R Zusammenhängende Werte in 2-dim. Array finden und zählen Allgemeine Java-Themen 3
S Sinnvolles skalieren von Werte-Set? Allgemeine Java-Themen 2
S Keytool: mögliche Werte für Parameter Allgemeine Java-Themen 4
P Werte in Array zählen und Summe der einzelnen Teile ausgeben Allgemeine Java-Themen 10
L Veränderbare Werte zusammenfassen Allgemeine Java-Themen 18
P Variablen Werte der Objektvariablen mit getFields() abfragen Allgemeine Java-Themen 2
O Variablen System.getenv: Sinnlose Werte, Arrays?! Allgemeine Java-Themen 6
J JSONObject Reihenfolge der Werte? Allgemeine Java-Themen 4
T java.uil.Random liefert negative Werte Allgemeine Java-Themen 2
c_sidi90 Werte an bestimmten Position aus PDF in DB sichern Allgemeine Java-Themen 2
C Vergleich von Enums gibt inkorrekte Werte Allgemeine Java-Themen 6
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
S Werte aus 2 eindimensionale boolean arrays mithilfe von logischen operatoren berechnen Allgemeine Java-Themen 6
C aus einem String einzelne Hex Werte lesen Allgemeine Java-Themen 7
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
M rxtx OutputStream sendet falsche werte Allgemeine Java-Themen 3
J Hex Werte in Bitmap Raster darstellen Allgemeine Java-Themen 16
E Werte übergabe Allgemeine Java-Themen 2
E Werte in andere Klasse übernehmen Allgemeine Java-Themen 8
S Bytes oder Hex-Werte zu Assembler Code? Allgemeine Java-Themen 6
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
P Methoden und Werte Allgemeine Java-Themen 17
M Kugelschnittberechnung liefert falsche Werte Allgemeine Java-Themen 4
N unzählige Werte am besten speichern(?) Allgemeine Java-Themen 2
D Spielerwechsel über boolsche Werte läuft inkorrekt Allgemeine Java-Themen 6
MonsterBit 2 Werte aus 2 Array vergleichen Allgemeine Java-Themen 10
T Apache POI Export EXCEL - [Zahlen-Werte] Allgemeine Java-Themen 1
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
Airwolf89 Zugriff auf Werte in ArrayList<ArrayList> Allgemeine Java-Themen 4
H Prüfen, ob doppete Werte in int-Array vorhanden sind Allgemeine Java-Themen 16
K Datenhaltungsklasse für wenige Werte? Allgemeine Java-Themen 4
T JProgressbar ändert werte nicht Allgemeine Java-Themen 28
C Eingegebene Werte werden nicht gezeichnet Allgemeine Java-Themen 2
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
hdi dynamische return-Werte Allgemeine Java-Themen 15
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
T Wurfweitenberechnung: X-Werte bei extremen Werten falsch. Allgemeine Java-Themen 15
G Excel Werte / Zellen formatieren Allgemeine Java-Themen 5
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
P Bedeutung der Process.exitValue() Werte? Allgemeine Java-Themen 3
C String to hex und hex-Werte löschen Allgemeine Java-Themen 2
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
M Werte im Browser aktualisieren Allgemeine Java-Themen 2
L Werte in externer Datei speichern und wieder auslesen? Allgemeine Java-Themen 8
MQue Werte in eine html- Datei schreiben Allgemeine Java-Themen 17
D werte in excelltabelle schreiben Allgemeine Java-Themen 5
N Werte Von C++ nach Java über den Stream möglich? Allgemeine Java-Themen 8
S JFreeChart LineChart Punkte über NULL Werte hinweg verbinden Allgemeine Java-Themen 5
G Werte zusammenfassen! Allgemeine Java-Themen 3
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
W PrintWriter (PrintStream) sendet falsche Werte Allgemeine Java-Themen 18
Y Methode soll 2 Werte zurückliefern Allgemeine Java-Themen 7
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
D Werte aus drei Auswahllisten Allgemeine Java-Themen 5
P JSlider nur bestimmte werte geben Allgemeine Java-Themen 2
P JavaCode verschlüsseln / verschlüsselte Werte Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben