Dies war eine Frage, die ich kürzlich in einem Interview gestellt hatte, als etwas, das der Kandidat der Java-Sprache hinzufügen wollte. Es wird allgemein als Schmerz bezeichnet, dass Java keine generischen Generika hat, aber wenn der Kandidat dazu gedrängt wurde, konnte er mir nicht sagen, was er hätte erreichen können, wenn sie dort gewesen wären.
Da in Java Rohtypen zulässig sind (und unsichere Überprüfungen), ist es offensichtlich möglich, Generika zu untergraben und am Ende eine zu erhalten List<Integer>
, die (zum Beispiel) tatsächlich String
s enthält . Dies könnte eindeutig unmöglich gemacht werden, wenn die Typinformationen geändert würden. aber es muss noch mehr geben !
Könnten die Leute Beispiele für Dinge posten, die sie wirklich tun möchten, wenn reifizierte Generika verfügbar sind? Ich meine, natürlich könnten Sie zur List
Laufzeit den Typ eines bekommen - aber was würden Sie damit machen?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
BEARBEITEN : Eine schnelle Aktualisierung, da die Antworten hauptsächlich über die Notwendigkeit besorgt zu sein scheinen, einen Class
als Parameter zu übergeben (zum Beispiel EnumSet.noneOf(TimeUnit.class)
). Ich habe mehr nach etwas gesucht, bei dem dies einfach nicht möglich ist . Beispielsweise:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
die Parametrisierung ignoriert werden müsste, dies aber defineClass()
nicht konnte). Und wie wir wissen, stehen die Powers That Be für die Abwärtskompatibilität an erster Stelle.