Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo, beim Programmieren bin ich auf Folgende 3 Schreibweisen gestoßen:
Code:
List<Integer> a = new List();
List<Integer> b = new List<>();
List<Integer> c = new List<Integer>();
Funktionieren tun alle 3, aber welche ist die Beste? Mein Lehrer behauptet, die letzten beiden sollte man nur verwenden, wobei das aus meiner sicht egal ist, da die Object datentypen dann eh gecastet werden.
Nehmen wir mal an, dass "List" hier nicht java.util.List ist, sondern irgendeine nicht-abstrakte Klasse mit einem Typparameter. Dann verwendet die erste Variante einen Raw Type (Verwendung eines generischen Typen ohne Typargumente), wozu die Java Language Specification $4.8 Raw Types folgendes zu sagen hat:
The use of raw types is allowed only as a concession to compatibility of legacy code. The use of raw types in code written after the introduction of generics into the Java programming language is strongly discouraged. It is possible that future versions of the Java programming language will disallow the use of raw types.
Eine falsche Verwendung oder Nichtverwendung von Generics führt niemals zu Laufzeitfehlern (es sei denn natürlich durch vom Benutzer explizite/manuelle falsche Downcasts), sondern höchstens zu Compilefehlern.
In diesem Fall kommt es aber nur zu einer Compilerwarnung, dass Raw Types verwendet wurden.
Nehmen wir mal an, dass "List" hier nicht java.util.List ist, sondern irgendeine nicht-abstrakte Klasse mit einem Typparameter. Dann verwendet die erste Variante einen Raw Type (Verwendung eines generischen Typen ohne Typargumente), wozu die Java Language Specification $4.8 Raw Types folgendes zu sagen hat:
Wie habe ich mir das dann denn vorzustellen? Und c führt zu keinen Compilefehlern? Denn so habe ich es in meinen älteren Projekten geschrieben, da ich da die b- Variante noch nicht kannte.
Variante a führt zu einer Compilerwarning (keinem Fehler).
Variante b ist seit Java 7 erlaubt (das Paar aus öffnender und gleich wieder schließender spitzer Klammer wird "Diamond Operator" genannt). Es ist ziemlich exakt dasselbe wie Variante c, nur dass eben seit Java 7 der Compiler schlau genug ist, die Nutzung von (in diesem Fall) Integer als Typargument automatisch aus der Deklaration der zugewiesenen Variablen zu erkennen, so dass du es bei der rechten Seite weglassen kannst.
Stack a = new Stack<String>();
a.push("a");
a.top().compareTo("ABC");
Also soll damit verhindert werden, dass sowas geschrieben wird? Aber das ist ja mehr oder weniger ein Laufzeitfehler. Oder was wäre dann ein konkretes Beispiel?
Was soll womit verhindert werden? Generics bzw. parametrische Polymorphie im Allgemeinen?
Wenn du das meinst, google mal nach Generics bzw. parametrischer Polymorphie.
Dann hab ich noch eine Frage: wenn ich <?> anstatt eines raw types nehme, ist besteht zwischen diesen ja eig kein unterschied? Also benutze ich dies einfach nur, weil raw types doof sind?
Wie habe ich mir das dann denn vorzustellen? Und c führt zu keinen Compilefehlern? Denn so habe ich es in meinen älteren Projekten geschrieben, da ich da die b- Variante noch nicht kannte.
Liest Du denn was wir schreiben? Wieso beantwortest Du unsere Fragen nicht? b) ist einfach eine kürzere Schreibweise fürs gleiche. Mich wundert es dass ein Anfänger offenbar diese Problematik kennt. Oder etwas anders ausgedrückt, "trolle" bitte woanders.
Ich habe nicht gesagt, dass ich Anfänger bin, ich möchte nur wissen, wie ich es richtig schreibe, da ich nicht von Java komme.... Das Thema ist halt von der Thematik her als Anfängerthema einzuordnen. Zudem habe ich deine Frage nicht beantwortet, weil sie sich von selbst geklärt hat.
Ich konnte "var" noch in keiner Programmiersprache was abgewinnen, in Java ist der Einsatz zum Glück etwas restriktiver. Auf lange Sicht sicher brauchbar.
MrXeth, letztendlich bleibt es dir überlassen, ob du Diamond verwendest oder den Typ (unnötigerweise) ein zweites Mal angibst. Laufzeitfehler kriegst du keine, weil letztendlich eh Object für die Liste verwendet wird. Nur wenn du dann Elemente der Liste behandelst, für die der Cast nicht klappt, dann geht's daneben.