Programmierung Java: Alles über Generics

Einer der ursprünglichen Entwurfsziele für Java war die Sprache so einfach wie möglich zu halten. Die Entwickler der Sprache nahm einige unnötig komplizierte Funktionen von C ++ und warf sie aus dem Fenster. Das Ergebnis war eine Sprache, die elegant und geschmeidig war. Einige Leute sagten, die Sprache zu glatt war.

So nach mehreren Jahren der Diskussion und Streiterei, wurde Java ein bisschen komplizierter. Bis zum Jahr 2004 hatte Java enum Typen, verbesserte für Schleifen, statische Import und einige andere interessante neue Features. Aber die am meisten gesprochen über neue Feature war die Einführung von Generika.

Anordnungsliste Menschen = new Arraylist() -

Die Verwendung von so etwas war neu in Java 5.0. Im alten Stil Java, würden Sie schreiben

Arraylist Menschen = new Arraylist () -

In jenen Tagen ein Anordnungsliste könnte speichern fast alles, was man in sie setzen wollte - eine Zahl, ein Konto, ein Zimmer, ein Schnur . . . etwas. Das Anordnungsliste Klasse war sehr vielseitig, aber mit dieser Vielseitigkeit kamen einige Kopfschmerzen. Wenn Sie irgendetwas in ein setzen könnte Anordnungsliste, Sie konnte sich nicht leicht vorherzusagen, was man aus einem bekommen würde Anordnungsliste.

Insbesondere könnte man nicht einfach Code schreiben, der Angenommen Sie haben bestimmte Arten von Werten in der gespeicherten hatte Anordnungsliste. Hier ein Beispiel:

Arraylist Dinge = new Arraylist () - things.add (Neues Konto ()) - Konto myAccount = things.get (0) - // Verwende dies nicht. IT'S BAD CODE.

In der dritten Zeile der Anruf an erhalten (0) packt den frühesten Wert in der Dinge Sammlung. Der Aufruf erhalten (0) ist in Ordnung, aber dann Drosseln der Compiler auf die versuchte Zuordnung zu mein Konto. Sie erhalten eine Nachricht, in der dritten Zeile sagen, dass alles, was Sie von der get Dinge Liste kann nicht in die gestopft werden mein Konto Variable.

Sie erhalten diese Nachricht, weil durch die Zeit der Compiler die dritte Zeile erreicht, es vergessen hat, dass das Element in der zweiten Zeile hinzugefügt Typ war Konto!

Die Einführung von Generika behebt dieses Problem:

Arraylist Dinge = new Arraylist () - things.add (Neues Konto ()) - Konto myAccount = things.get (0) - // diesen Code verwenden STATT. IT'S GOOD CODE.

Hinzufügen an zwei Stellen teilt dem Compiler mit, dass Dinge Geschäfte Konto Instanzen - sonst nichts. Also, in der dritten Zeile in dem obigen Code, erhalten Sie einen Wert aus der Dinge Sammlung. Dann, weil Dinge speichert nur Konto Objekte können Sie machen mein Konto beziehen sich auf diesen neuen Wert.

Java 5.0 hinzugefügt Generika Java. Doch schon bald nach der Geburt von Java 5.0, Programmierer bemerkt, wie ungeschickt der Code für Generika sein kann. Schließlich können Sie Generika innerhalb Generika erstellen. Ein Anordnungsliste von denen jedes eine Reihe von Arrays enthalten können, seien sie ein Anordnungsliste. So können Sie schreiben

Anordnungsliste[]> Chaos = new Arraylist[]> () -

All die Wiederholung, dass Chaos Erklärung gibt Programmierern Kopfschmerzen! Um dies zu vermeiden Hässlichkeit, Java 7 und späteren Versionen haben eine Diamant-Operator, lt;>. Der Diamant Operator sagt Java wieder zu verwenden, was auch immer wahnsinnig komplizierte Dinge, die Sie im vorherigen Teil der generischen Erklärung setzen.

In diesem Beispiel ist die lt;> sagt Java wiederzuverwenden []>, auch wenn Sie schreiben []> nur einmal. Hier ist, wie das schlanke Java 7 Code aussieht:

Anordnungsliste[]> Chaos = new Arraylistlt;>() -

In Java 7 und höher können Sie entweder von diesen schreiben Chaos Erklärungen - das Original, böse Erklärung mit zwei Vorkommen von Anordnungsliste[], oder die rationalisiert (nur leicht böse) Erklärung mit dem Diamant Operator und nur eine Anordnungsliste[] Auftreten.

Ja, die rationalisierte Code ist immer noch kompliziert. Aber ohne den ganzen Anordnungsliste[] Wiederholung, die rationalisierte Code ist weniger umständlich. Die Java 7 Diamant Operator nimmt eine Chance weg für Sie etwas falsch zu kopieren und einen großen Fehler in Ihrem Code haben.

Menü