Generics - Rechtliche Alternative für (Elemente instanceof List? erstreckt sich vergleichbar)

8

Ich habe diese Methode, deren eindeutiger Parameter (List elements) Elemente zu einem ListModel setzt, aber ich muss eine Validierung durchführen, um zu sehen, ob der generische Typ vergleichbar ist und so etwas wie:

%Vor%

ist illegal, ich weiß nicht, wie man die richtige Validierung durchführt.

Aktualisieren

Ich habe diese Validierung bereits durchgeführt mit:

%Vor%

Aber ich möchte wissen, ob es eine sauberere Lösung dafür gibt, zum Beispiel mit Reflektion?

Vielen Dank im Voraus.

    
Juan Diego 07.08.2011, 19:04
quelle

4 Antworten

4

Der generische Typ einer Liste ist zur Laufzeit gelöscht . Damit dies funktioniert, müssen Sie entweder den Parameter in der Methodensignatur anfordern oder jedes Element einzeln testen.

%Vor%

ODER

%Vor%

Wenn Sie die Kontrolle über den Code haben, wird ersterer bevorzugt und sauberer; Der letztere kann bei Bedarf in einen Aufruf der Dienstprogrammmethode eingeschlossen werden.

    
Andrew White 07.08.2011 19:06
quelle
1

Das ist nicht möglich. instanceof ist ein Laufzeitoperator, während generische Informationen zur Laufzeit verloren gehen (type-erasure).

    
hoipolloi 07.08.2011 19:06
quelle
1

Ich bin kein Generics-Guru, aber nach meinem Verständnis ist der Grund dafür, dass zur Laufzeit kein Unterschied zwischen einem ArrayList und, sagen wir, einem ArrayList<String> besteht. Es ist also zu spät, um den gewünschten Test durchzuführen.

Warum deklarieren Sie Ihre Methode nicht so, dass sie eine List<? extends Comparable> anstelle von List akzeptiert?

Insbesondere die Art und Weise, wie Sie Ihre Frage formuliert haben, lässt es so klingen, als würden Sie erwarten, dass die Liste immer homogene Elemente enthält, aber ein einfaches altes List gibt Ihnen keinerlei Sicherheit das.

    
Dan 07.08.2011 19:09
quelle
1

Zu Ihrem Update: einfach sicherstellen, dass ein Element Comparable implementiert ist nicht genug (was ist, wenn die anderen nicht?) Und sicherzustellen, dass alle Elemente implementieren Comparable ist auch nicht genug zu validieren (was ist, wenn sie sind von verschiedenen Klassen, die vergleichbar implementieren, aber nicht miteinander vergleichen können?).

Aber die größere Frage ist, warum sollte man sich zur Laufzeit trotzdem überprüfen lassen? Welchen Nutzen hat das im Vergleich zu dem Versuch, es zu verwenden und dann zu sehen, dass es fehlschlägt (d. H. Eine Exception auslöst, die Sie vielleicht fangen können)?

    
newacct 07.08.2011 21:07
quelle

Tags und Links