Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java Grundkurs 3: Generische Programmierung, Datenströme, Datumsrechnung

Generics einschränken und erweitern

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
In diesem Video erläutert der Trainer, wie sowohl die Typ-Parameter im Generics-Producer als auch die Parametrisierung im Generics-Consumer mithilfe der Schlüsselwörter extends und super eingeschränkt werden können.

Transkript

Bei der generischen Programmierung mit Generics legen wir im Generics-Producer also hier Typ-Parameter fest, die wir im Generics-Consumer mit Datentypen parametrisieren. Bislang hatte ich Ihnen erzählt, dass Sie hierbei jegliche Datentypen einsetzen können. Allerdings lässt sich dies auch steuern. Denn im Generics-Producer, wo wir bislang alle Datentypen zugelassen haben, können wir Einschränkungen vornehmen. Und im Generics-Consumer, wo wir bislang einen einzigen Datentyp festgelegt hatten, können wir die potentiell erlaubten Datentypen erweitern. Wir schauen uns zunächst mal an, wie man die Datentypen auf der Producer-Seite einschränken kann. Hierfür wechsle ich auf die Klasse BMIKoerper, bei der wir bislang festgelegt hatten, dass es sich bei der Parametrisierung um jeglichen Datentypen handeln kann. Die Variablen E und F können also einen beliebigen Datentyp einnehmen, solange es sich nicht um einen elementaren Datentyp handelt. Nun können wir im Producer aber auch festlegen, dass es sich bei den Datentypen seine Objekt Variabln E und F zwingend um Zahlen handeln soll. Hierfür setzen wir das Stichwort Extends ein. Ich schreibe also E extends Number. Und das gleiche werde ich auch für den Typ-Parameter F vornehmen, also hier, F extends Number. Wir möchten also nicht, dass die Parametrisierung mit jeglichem Datentypen erlaubt ist, sondern dass es sich um einen Datentyp handelt, der Number zum Vorfahren hat. Kommen wir nun zum Consumer, wo wir die Festlegung der Datentypen erweitern können. Ich öffne mal die Klasse APP. Bisher haben wir in der Consumer- Klasse festgelegt, dass der Datentyp, der inneren Variablen vom BMIKoerper immer zwingend ein Double sein muss und zwar hier und hier. Nun könnte man auf die Idee kommen, dass wir auch hier andere Datentypen zulassen, die von Number abgeleitet sind. Allerdings wäre diese Erweiterung beim Consumer mit Problemen behaftet. Ich zeige Ihnen zunächst mal, wie man das machen würde. Und zwar würde man auch hier wieder mit dem Schlüsselwort Extends arbeiten und statt des Datentyps Double den Ausdruck Fragezeichen, Extends Number setzen, also dort. ? beziehungsweise Wildcard extends Number und auch hier. Und nun muss ich das überall genauso machen, also auch hier oben. Ich kopiere mal diesen Ausdruck ? Extends Number über Strg + C und dann kann ich Double markieren und über Strg + V das Double einfach ersetzen. So das mache ich jetzt überall, wo ich Double stehen habe, denn so wollen wir das ja haben. So auch hier und dort und ich glaube ich habe jetzt alle Double-Vorkommen ersetzt. Jetzt hat mir Eclipse alle Stellen unterstrichen, bei denen ich offensichtlich einen Fehler habe. Und zwar handelt es sich hier oben um folgenden Fehler. The type new BMIRechner(){} cannot extend or implement Diese Klasse supertype may not specify any wildcard. Hier bei der Methode steht The method Rechner must override or implement a supertype method. Das funktioniert auch nicht. Hier unten haben wir einen ähnlichen Fall, wo uns der gar nicht erst erlaubt, dass eine Number-Variable ein Double-Wert zugewiesen werden kann, da sich bei Laufzeit schwerwiegende Probleme ergeben könnten. Es ist zwar vorstellbar, dass es auch Fälle gibt, in den man sich mit solchen Probleme nicht rumschlagen muss. Aber am besten ist es als Faustregel, wenn ich bei meinem Consumer auf eine Erweiterung verzichte, denn schließlich weiß ich ja, dass ich es mit Double- Variablen zu tun habe. Warum sollte ich die Auswahl also erweitern? Abschließend möchte ich Ihnen noch ein weiteres Schlüsselwort zeigen, das Sie für die Erweiterung im Consumer einsetzen können und das ist Super. Super kann ausschließlich im Consumer eingesetzt werden. Im Producer ist Super also nicht erlaubt. Trotzdem wechsle ich aber nun in den Producer BMIRechner, denn auch ein Producer kann andere generische Datentypen einsetzen und gleichzeitig Consumer sein. Das schauen wir uns jetzt mal an. Beim BMIRechner könnte ich nun festlegen, dass der Übergabe-Parameter der Methode Rechne zwingend ein BMIKoerper oder ein Nachkomme vom BMIKoerper sein könnte. Auch hierfür würde ich wieder das Schlüsselwort Extends einsetzen. Ich schreibe also V extends und dann BMIKoerper und hier schränke ich ein auf Double und Double und hiermit habe ich nun festgelegt, dass der BMIRechner nur BMIKoerper oder Kindesklassen von BMIKoerpern berechnet und dass die objekt variablen von BMIKoerper vom Datentyp Double sind. Da ich nun eine generische Klasse verwende, bin ich als BMIRechner gleichzeitig auch Konsument. Daher kann ich Ihnen auch das Schlüsselwort Super zeigen. Das nur bei Konsumenten eingesetz werden kann. Über das Schlüsselwort Super kann ich festlegen, dass ich Vaterklassen eines bestimmten Datentyps zulasse. Beispielsweise lege ich mit ? Super-Double fest, dass der BMIKoerper, der im Interface BMIRechner eingesetzt wird, bei seinen objekt Variablen die Datentypen Double Number und Object zulässt. Ich kann also folgendes schreiben: Statt Double schreibe ich rein: ? super Double. Und auch hier: ? super Double. Und das speichere ich noch ab. Und als nächstes gehe ich noch in die Startklasse und korrigiere dort die Fehler, die ich eingebaut habe. Über Strg + Z mache ich alles rückgängig. So. Und jetzt müsste mein Beispielprogramm wieder funktionieren. Und jetzt testen wir das auch noch. Ich brauche eine Groesse für die Katze: 0,51 m und ein Gewicht 6,1 Kg und das ergibt den BMI-Wert 23,5. In diesem Video habe ich Ihnen gezeigt, wie Sie Generics einschränken oder erweitern können. Hierfür können Sie im Producer das Schlüsselwort Extends und im Consumer die Schlüsselworte Extends und Super verwenden. Betrachten wir das Interface BMIRechner, so haben wir mit Super Double, dort, beispielsweise festgelegt, dass die internen des BMI-Koerpers vom Typ Double, Number oder Objects sein dürfen. Durch die Einschränkung Extends Number und zwar hier in der Klasse BMIKoerper, können wir in Wirklichkeit aber nur die Datentypen Double und Number einsetzen.

Java Grundkurs 3: Generische Programmierung, Datenströme, Datumsrechnung

Steigen Sie tiefer in die Java-Programierung ein und lernen Sie den Umgang mit generischen Typen, Lamda-Ausdrücken, DAtenströmen und mit Datums- und Zeitberechnung.

5 Std. 24 min (47 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:09.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!