2013-03-21 20 views
6

Ich hatte vor kurzem eine Prüfung auf Java, und es gab einen breiten Abschnitt über Joker-Generika in Java. Es wird jedoch sehr wenig über ihre Verwendung in der Praxis gesagt. Wann sollten wir sie benutzen? Lassen Sie uns eine typische Nutzung sehen:Praktische Verwendung von Wildcard-Generics in Java

Was die Dokumentation sagt, dass diese Sammlung nicht erlaubt, Elemente zur Liste hinzuzufügen. Im Grunde können Platzhalter verwendet werden, um Sammlungen schreibgeschützt zu machen. Ist das ihre einzige Verwendung? Gibt es dafür ein praktisches Bedürfnis? In den letzten vier Jahren habe ich an vielen Programmierprojekten in Java teilgenommen, aber ich habe noch kein Projekt gesehen, das solch eine Funktion als Wildcard nutzen würde.

Gibt es also aus praktischer Sicht Situationen, in denen Wildcard-Generika unvermeidbar und notwendig sind?

+0

Basierend auf den widersprechenden Antworten, ist Ihre Frage ziemlich gut. :-) –

Antwort

3

Also gibt es aus der praktischen Sicht, gibt es Situationen, in denen Wildcard-Generika unvermeidlich und notwendig sind?

Ich glaube nicht, dass sie "unvermeidlich und notwendig" sind, weil der Java-Compiler sie sowieso löscht. Wenn Sie sie jedoch verwenden, profitieren Sie von einer strengeren Typprüfung während der Kompilierungszeit und vermeiden das Typcasting. Wer möchte schon mal tippen?:)

Guidelines for Wildcard Use

Type Erasure

+0

Danke, ich habe diese Richtlinie etwas verpasst, sie erklärt die Grundregeln für die Verwendung von Wildcard –

1
void check(Collection<? extends Animal> list) { 
    list.add(new Animal()); // compile time error 
    list.add(new Dog()); // compile time error. Dog is subclass of Animal class. 
} 

Java hat eine solche Generika zu entwickeln, weil die programmar, um Code zu verbieten, was sie sonst wollen, wenn es dann erlaubt ist, später werden sie ein Chaos in Laufzeitumgebung zu finden.

Irgendwann in der Programmierung erhalten Sie ein Szenario, in dem Ihre Methode check würde nicht Element in der Liste hinzufügen möchten, aber diese Elemente lesen möchten.

Sie können nur null Werte hinzufügen.

+0

Sie haben Recht, aber bitte zitieren Sie ein Dokument. Es klingt komisch. –

0

Kurz gesagt, was Sie sagen, ist falsch.

Es hat nichts zu tun, um "Sammlungen schreibgeschützt" zu machen.

Wir können weiterhin Elemente zur Eingabeliste hinzufügen, weil Collection eine add(E) Methode deklariert hat.

Der Platzhalter ist geradlinig Ich denke: Sie möchten den Eingabetyp tatsächlich beschränken, weil Ihre Logik nur für bestimmte Typen sinnvoll ist.

Für Ihr Beispiel, Ihr Scheck vielleicht eine Methode für Tier mit

void check(Collection<? extends Animal> list) { 
    // Do something 
    for (Animal a : list) { 
    a.checkAge(); // checkAge() is method of Animal 
    } 
} 

Ohne ? extends Animal, wird der obige Code nicht funktionieren, da die Eingangsliste Sammlung von irgendetwas sein kann (nicht Tier).

Daher möchten wir sicherstellen, dass die eingehende Sammlung zu Collection oder Collection usw., so dass unser Code tatsächlich Sinn macht, wie wir Elemente aus der Liste abrufen und behandelt das Element als Animal.

Verwandte Themen