Verwirrt beim Java Collection Framework aufruf!

ocsme

Top Contributor
Guten Tag,

ich habe nachgelesen, dass
ArrayLists, LinkedLists, etc. mit unterschiedlichen Elementtypen inkompatible sind und nicht gemischt werden können!

somit liefert folgender Aufruf einen Compiler Fehler:
Java:
ArrayList<Object>     objectlist = new ArrayList<String>(); //FEHLER

Bis jetzt habe ich mich mit den Generics noch nicht beschäftigt vielleicht fällt dann erst der Groschen.
Denn wieso funktioniert dann dieser Aufruf?
Java:
List<Object> ol = new LinkedList<>();

Diese erstelle LinkedList kommt einem Object[] gleich. Dort kann ich sämtliche Object rein stecken und über "hoffentlich" vorhandene toString() Mehtode mit foreach Schleife ausgeben lassen:
Java:
for(Object i:l)
            System.out.println(i.toString()+" ");

Ich verstehe einfach nicht was diese <> Klammer tun?
In Java ist eine Insel steht weiterhin dieses: (was ja schon die Antwort ist denke ich :D)
Da in allen Datenstrukturen jedes Exemplar einer von Object abgeleiteten Klasse Platz findet, sind die Listen grundsätzlich nicht auf bestimmte Datentypen fixiert, doch Generics spezifizieren diese Typen genauer.

Da ich oben diese spezifikatioin auf Object lege ist der Generice Typ Objet und somit alles zugelassen?
Vielleicht könnt Ihr mir das genauer erklären :) wäre euch sehr dankbar :)

LG
 

httpdigest

Top Contributor
Nein. Der Diamond "<>" dient nur dazu, weniger Schreibarbeit im Wiederholen desselben Typargumentes bei der Instanziierung eines generischen Typs und bei der Deklaration der zugewiesenen Variablen zu haben.
Also z.B.:
Java:
List<String> list = new ArrayList<>();
// ist dasselbe wie:
List<String> list = new ArrayList<String>();
Siehe: https://docs.oracle.com/javase/tutorial/java/generics/types.html#diamond

Dein Code:
Java:
ArrayList<Object> objectlist = new ArrayList<String>();
liefert deswegen einen Fehler, weil generische Typen nicht covariant in den Typargumenten sind. Arrays sind allerdings covariant in dem Elementtyp, deshalb ist bei Arrays auch sowas möglich:
Java:
Object[] arr = new String[5];
Das geht nur nicht bei generischen Typen mit Typparametern.
 
K

kneitzel

Gast
Also das mit den <> sind die Generics.

Und wenn Du Zuweisungen machst, dann muss der Typ stimmen!

Also wenn Du eine Variable vom Typ X hast, dann kannst Du da nur X (oder davon abgeleitete Klassen) zuweisen. Ist ja klar: Wen Du eine Katze haben willst, dann kann man die nur eine Katze geben (Aber da kann es eine beliebige Katze sein.) Aber wenn man versucht, die einen Hund zu geben, dann wirst Du den nicht annehmen wollen.

Und das gilt auch bei Listen:
Wenn Du einen Behälter für beliebige Gegenstände (Object) haben willst: Da wirst Du einen Behälter nur für Bücher (In Deinem Code String) nicht annehmen.
Aber umgekehrt würde es gehen: Du willst einen Behälter für Bücher, aber nun bekommst Du einen Behälter in den du alles (Also auch Bücher) stecken kannst: Das wäre ok für Dich, oder?

Und die Generics dienen dazu, dass die Typsicherheit gegeben ist. Früher hat man dann Listen und so gehabt, die halt Object gespeichert haben. Aber wenn Du dann in die Liste, in der Autos gespeichert werden sollten, was anderes gespeichert hast, dann war das der Liste egal. Der Compiler hat nicht gemeckert. Aber wenn dann das Element ausgelesen wurde und als Auto verwenden werden sollte, dann gab es natürlich Probleme... Wurde dann oft durch Schreibarbeit gelöst: Was jetzt ein List<Auto> ist, war damals dann eine Klasse AutoList welches ein List hatte und alle Funktionen der List nur eben mit Auto als Typ, die dann von/zu Object gecastet wurden. (Zu Object muss man nicht casten, aber die Object der List wurden dann zu Auto gecastet.)
==> Also Generics haben hier uns viel Arbeit abgenommen....
 

mihe7

Top Contributor
somit liefert folgender Aufruf einen Compiler Fehler:
Java:
ArrayList<Object>     objectlist = new ArrayList<String>(); //FEHLER
Das kann man sich ganz einfach herleiten. Um es ganz deutlich herauszustellen, kann man das mal mit zwei Variablen schreiben:
Java:
ArrayList<String>     stringlist = new ArrayList<String>(); 
ArrayList<Object>     objectlist = stringlist;
objectlist.add(new int[]{1,2,3}); // fügt ein Array in die objectlist ein.
String str = stringlist.get(0); // örks
Daher ist die Zuweisung objectlist = stringlist nicht möglich.
 

ocsme

Top Contributor
Ja und mir ist auch die Tage aufgefallen das wenn man nur ArrayList objectlist = new ArrayList<>(); schreibt die Liste auch vom Typ Objekt ist.

Java:
        ArrayList slist = new ArrayList<>();
        Object a = 2;
        Object b = 3.14;
        Object c = "test";
        
        slist.add(a);
        slist.add(b);
        slist.add(c);
        
        slist.set(0, "23");
        
        System.out.println(slist.remove(2));
        System.out.println(slist.remove("3"));
        
        String ss = (String) slist.get(0);

Die Generics werde ich mir jetzt mal anschauen :) Denke dann wird das alles auch wieder etwas klarer :)

Danke nochmals für die schnellen und netten Antworten :)

LG
 

mihe7

Top Contributor
Ja und mir ist auch die Tage aufgefallen das wenn man nur ArrayList objectlist = new ArrayList<>(); schreibt die Liste auch vom Typ Objekt ist.
Klar. Auf der linken Seite gibst Du keinen Typ an, also wird Object angenommen (schon aus Gründen der Kompatibilität) und der Compiler spuckt eine Warnung aus, sobald Du eine normalerweise typsichere Methode verwendest.
 

ocsme

Top Contributor
Eine "Idioten" Frage hätte ich noch.
Wie bekomme ich Eclipse verklickert das die Klasse nun public class Rational<T> heißen soll?
Er macht immer daraus public class Rational.
Kennt Ihr das Problem?

LG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Versionen (bin verwirrt) Java Basics - Anfänger-Themen 5
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
D Ein simples Problem . *verwirrt sei* Java Basics - Anfänger-Themen 2
Juelin jedit Fehler beim starten Java Basics - Anfänger-Themen 2
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
M Ausgabe beim Overloading Java Basics - Anfänger-Themen 3
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
T DamagedFontException beim drucken Java Basics - Anfänger-Themen 3
Z SNAKE Schlange beim Aufheben von Essen verlängern Java Basics - Anfänger-Themen 4
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
B Objekte verschwinden beim Übersetzen Java Basics - Anfänger-Themen 5
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
S Fehler beim Programm Java Basics - Anfänger-Themen 2
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
I InputStream beim zweiten Mal fehlerhaft Java Basics - Anfänger-Themen 10
C Fehler beim erstellen eines Objektes Java Basics - Anfänger-Themen 3
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
cmn489 Werte beim Funktionsaufruf in ein Feld übertragen(falls dieses leer ist) Java Basics - Anfänger-Themen 1
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
pry bitte Hilfe beim Kreditrechner objektorientiert Java Basics - Anfänger-Themen 6
J Hilfe beim Label animieren Java Basics - Anfänger-Themen 1
Avalon Programmierstil beim Mocken Java Basics - Anfänger-Themen 45
Avalon NullPointerException beim Mocken Java Basics - Anfänger-Themen 6
J Hilfe beim verstehen Java Basics - Anfänger-Themen 3
A Fehler beim Ausführen einer class Datei Java Basics - Anfänger-Themen 6
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Compiler-Fehler Fehler beim Ausführen des Codes Java Basics - Anfänger-Themen 25
L Anfänger braucht Hilfe - Stecke beim Lernen fest Java Basics - Anfänger-Themen 10
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
Bluedaishi Hilfe beim erklären dieser Methode Java Basics - Anfänger-Themen 5
E Macht Java Rechenfehler beim Potenzieren und Mod? Java Basics - Anfänger-Themen 5
J Hilfe beim Programmieren Java Basics - Anfänger-Themen 5
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
Kirby.exe Fehler beim Ausgeben Java Basics - Anfänger-Themen 2
L Brauche Hilfe beim arbeiten mit Konstruktoren Java Basics - Anfänger-Themen 20
D Was tun gegen zu komplzierten Denken beim Programmieren Java Basics - Anfänger-Themen 27
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
J NullPointerException beim Klonnen eines Arayys und beim aufrufen einer Methode Java Basics - Anfänger-Themen 2
J Fehler beim generieren von 4 Zufallszahlen Zahl doppelt ist eigentlich ausgeschlossen Java Basics - Anfänger-Themen 9
L Kleine Hilfe beim Schreiben eines Programmes benötigt :D Java Basics - Anfänger-Themen 40
T Fehlermeldung beim Versuch, einen String einzulesen Java Basics - Anfänger-Themen 4
V Wie wiederhole ich eine for-Schleife beim erreichen eines Wertes Java Basics - Anfänger-Themen 9
W Hilfe beim Chat Programm Java Basics - Anfänger-Themen 14
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
S IndexOutOfBoundsException beim hinzufügen eines Elements zu einer Liste Java Basics - Anfänger-Themen 11
R String index out of range: -1 beim Datei Parsen Java Basics - Anfänger-Themen 15
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
B EJB und Arquillian - bekomme Nullpointer Exception beim Aufruf der EJB Klasse Java Basics - Anfänger-Themen 40
S switch case fängt beim letzten case an Java Basics - Anfänger-Themen 6
S Erste Schritte Hilfe beim lernen von Programmieren Java Basics - Anfänger-Themen 2
der_Schokomuffin Hilfe gesucht beim Thema Objekte übergeben! Java Basics - Anfänger-Themen 2
A Pendeltouren beim Savings erfahren "schummeln" in Ordnung? Java Basics - Anfänger-Themen 1
dapzoo Compiler-Fehler Beim Werte verteilen in Objektarray NullPointerException Java Basics - Anfänger-Themen 4
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
T Fehlermeldung beim Starten von FlashTool Java Basics - Anfänger-Themen 27
C Rekursives Backtracking beim Spiel Peg Java Basics - Anfänger-Themen 22
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
J Hilfe beim Runden Java Basics - Anfänger-Themen 4
C Erste Schritte ArrayIndexOutOfBoundsException beim Speichern im Array Java Basics - Anfänger-Themen 2
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
L Fehler beim laden eines Icons Java Basics - Anfänger-Themen 3
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
R Methoden NPE beim Aufruf einer Methode einer anderen Klasse Java Basics - Anfänger-Themen 4
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
J Probleme beim Array ausgeben Java Basics - Anfänger-Themen 4
CptK Bild beim betätigen eines JButtons Java Basics - Anfänger-Themen 6
D Könnt ihr mir helfen beim Programmieren eines Ping Pong Spieles? Java Basics - Anfänger-Themen 9
N Fehlermeldung beim ausführen des Programmes.. Java Basics - Anfänger-Themen 3
K Classpath RXTX beim Raspberry Java Basics - Anfänger-Themen 5
F (Eclipse) Beim importieren etwas fehlerhaft bitte um Hilfe :) Java Basics - Anfänger-Themen 3
B Datentypen Welcher Typ wird beim Casten übernommen? Java Basics - Anfänger-Themen 12
U Best Practice Fehleranalyse, welche Fehler macht Ihr beim Lernen bzw. auch später Java Basics - Anfänger-Themen 12
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
G Methoden Probleme beim Methodenaufruf Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben