Wie Generics richtig benutzen ?

xlChaos

Mitglied
Moin zusammen !

Wir haben in unserer vorletzten Vorlesung etwas zum Thema Generics& LinkedList gelernt.

So wie ich das verstanden habe, werden Generics(<T>) einfach nur dafür benutzt um festzulegen, welcher Datentyp die Elemente(z.B. in einer LinkedList )beinhalten.

Generics werden in spitze Klammern gesetzt und nach einem Klassennamen geschrieben. Danach kann man den Klassennamen bei der Erzeugung eines Objekts einfach durch den Typparameter T ersetzen und das wars.

Wir haben einen Aufgabenzettel bekommen wo wir erst 3 Klassen schreiben sollten :

Student ( nachname,vorname, jahrgang, matnr)
Node (next, Student data)
LinkedList (root, last, current <- Alle vom Typ Node)

Es gibt eine Test Klasse die wie folgt geschrieben ist:

Java:
public class TestLinkedList<T> {

    public static void main(String[] args) {
        Student first = new Student ("Mueller", "Markus", 1990,1);
        Student second = new Student ("Meier", "Michael", 1991,2);
        Student third = new Student ("Schmidt","Sebastian",1992,3);
        
        LinkedList studenten = new LinkedList();
    
        studenten.append(first);
        studenten.append(second);
        studenten.append(third);
        studenten.append(first);
        
        
        if (studenten.isEmpty())
            return;
        Student s = (Student)studenten.getFirst();
        System.out.println(s);
        
        while (studenten.hasNext()) {
            s = (Student)studenten.getNext();
            System.out.println(s);
        }
        studenten.getFirst();
        System.out.println(studenten.hasNext());
        System.out.println(studenten.getLast());
    }

}

So wie ich das hier geschrieben habe funktioniert es auch. Wir hatten die Aufgabe in den Klassen Node und LinkedList, alle Studentenobjekte mit den Generics zu ersetzen, so dass die main Klasse auch funktioniert danach.

Ich musste hier nur 2 mal von Object auf Student typecasten, was irgendwie glaube nicht so toll ist und unser eigentliches Ziel war ...
Ohne die Typecasts kam die Fehlermeldung : Cannot convert from Object to Student

Wie löse ich das mit Generics in der Mainmethode ? Ich habe <T> ja bereits beim Klassennamen hingeschrieben, nur egal wo ich ein T setze, kommt immer die Fehlermeldung mit static reference to a non-static field...

Ich will jetzt auch nicht die Lösung vorgekaut bekommen sondern freue mich über Tipps und Hinweise, wie ich das jetzt gelöst bekomme.

Vielen Dank !
 

temi

Top Contributor
LinkedList<Student> studenten = new LinkedList<>();

Deine Version entspricht im Prinzip LinkedList<Object> studenten = new LinkedList<>();

So ganz hab ich die Aufgabe nicht verstanden. Sollt ihr die Klasse mit der main() jetzt anpassen oder soll sie unverändert bleiben?

Edit: Ach so, und was das class TestLinkedList<T> soll erschließt sich mir nicht. Ist das "ich schreib einfach mal überall <T> hin und schau was passiert", oder wie?
 
Zuletzt bearbeitet:

temi

Top Contributor
So wie ich das verstanden habe, werden Generics(<T>) einfach nur dafür benutzt um festzulegen, welcher Datentyp die Elemente(z.B. in einer LinkedList )beinhalten.
Das stimmt so. T steht sozusagen als Platzhalter für den tatsächlichen Typen.

Generics werden in spitze Klammern gesetzt und nach einem Klassennamen geschrieben. Danach kann man den Klassennamen bei der Erzeugung eines Objekts einfach durch den Typparameter T ersetzen und das wars.
Fast. Man muss schon noch angeben, welchen Typen man bei der Verwendung der generischen Klasse haben möchte. Das geschieht bei der Deklaration der Variablen. In deiner main(): LinkedList<Student>, was eine LinkedList für Studenten darstellt.
 

xlChaos

Mitglied
LinkedList<Student> studenten = new LinkedList<>();

Deine Version entspricht im Prinzip LinkedList<Object> studenten = new LinkedList<>();

So ganz hab ich die Aufgabe nicht verstanden. Sollt ihr die Klasse mit der main() jetzt anpassen oder soll sie unverändert bleiben?

Edit: Ach so, und was das class TestLinkedList<T> soll erschließt sich mir nicht. Ist das "ich schreib einfach mal überall <T> hin und schau was passiert", oder wie?

Hi, danke schon mal für deine Antwort. Wir sollten die Node und die LinkedList Klasse mit den Typparameter "befüllen", damit man quasi nicht mehr Studentenobjekte erzeugen muss sondern einfach die Generics nutzen kann.


Zu der Frage warum ich TestLinkedList<T> schreibe kann ich dir keine Antwort geben :D Ich habe es glaube noch nicht ganz verstanden, wann und wo man <T>oder einfach T schreibt...

Und mein eigentliches Problem und Frage ist, ob ich überhaupt einen Typparameter brauche in der main und wenn ja, wie ich das denn umsetzen soll ohne Fehler. Sobald ich <T> oder T schreibe kommen immer Fehlermeldungen. Wenn ich nichts schreibe, will eclipse nur, dass ich die beiden "studenten" LinkedLists Typecaste...
 
Zuletzt bearbeitet:

xlChaos

Mitglied
Hier mal meine Node Klasse:


Java:
public class Node<T> {
   
    private T data;
    private Node<T> next = null;
   
    public Node (T data) {
        this.data = data;
        this.next = null;
    }
   
    public Node<T> getNext() {
        return next;
    }
   
    public void setNext (Node<T> next) {
        this.next = next;
    }
    public T getData( ) {
        return this.data;
    }
   
    public void setData (T data) {
        this.data = data;
    }
}

Warum soll hinter jedem "Node" ein <T> stehen ? Eclipse zeig mir das nicht als Fehler an, aber es wird gelb angemakert wenn da kein <T> steht... Funktionieren tut es trotzdem
 

LimDul

Top Contributor
Also, was man sich zu Generics merken muss:
* Generics existieren nur zur Compile-Zeit. Zur Laufzeit existieren die nicht.

Das heißt, folgende drei Listen sind zur Laufzeit quasi identisch:

Code:
List<Object> list1;
List<Student> list2;
List<RandomKlasse> list3;
List list4;

Wenn man sich das merkt, werden manche Dinge verständlich.

Wofür nutzt man Generics? Man möchte sicherstellen, dass mehrere Parameter/Rückgabewerte den gleichen Typ haben. Beispiel bei der Liste, man möchte das die get Methode den gleichen Typ zurückliefert, den die add Methode als Eingabe erlaubt. Man kann aber gleichzeitig nicht den Typ schon fest vorgeben - weil das macht erst der Nutzer der Liste. Vor Generics war es so, dass Typ zwangsweise fest vorgeben Object war. Damit konnte man alle Objekte reinstecken - man konnte es aber nicht einschränken.

Mit Generics kannst du nun sicherstellen, dass du den Typ einschränken kannst und der Compiler prüft das (zur Laufzeit kommt wieder die gleiche Liste wie früher raus, die in Wirklichkeit Objekte vom Typ Objekt verwaltet).

Bzgl. deiner Frage "Warum soll hinter jedem Node der Generics-Typ-parameter stehen?" Nun du sagst "Das Datenobjekt von meiner Node ist durch den Generics-Parameter T beschrieben". Das heißt der Nutzer erstellt z.b.
Java:
Node<String> myNode = new Node<>("Daten");
Wenn du nun auf der myNode.getNext aufrufst, bekommst du wieder ein Node Objekt zurück. Wenn du das ohne Typ-Parameter machst, dann hat dieses Node Objekt quasi als Datentyp "Objekt". Wenn du also getData auf dieser Node aufrufen würdest, würde ein Objekt vom Typ Objekt zurückommen und kein String. Das willst du mit Sicherheit nicht, weswegen du als Rückgabe von getNext Node<T> definierst.

Da Generics nur zur Compile-Zeit existierten, kannst du alle Klassen auch ohne Generics verwenden (Was im Endeffekt dem entspricht, wenn du Objekt als Generics Parameter reinsteckst). Allerdings will man das in 99% der Fälle nicht, weswegen der Compiler sagt "Die Klasse erwartet ein Generic, aber du verwendest es ohne - das ist zu 99% falsch.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Generics - Map.putAll lässt sich nicht richtig implementiern Java Basics - Anfänger-Themen 6
K generics richtig verstehen Java Basics - Anfänger-Themen 4
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
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

Ähnliche Java Themen

Neue Themen


Oben