Ich möchte ein Map
mit mehreren Listen, jeder von ihnen besteht aus Comparable
Objekte, aber nicht immer die gleiche, so könnte es eine List
von Doubles
und List
von Strings
, etc sein ...Generika Karte mit Listen von Vergleichbare
Map<String, List<Comparable<?>>>
Leider ist die Map
wie oben definiert sind nicht sinnvoll, da die Elemente in jeder List
nicht verglichen werden können. Deshalb hatte ich einen Typ-Parameter auf die Klasse zu betrügen und vorstellen:
class MyClass<T extends Comparable<? super T>> {
Map<String, List<T>> myMap;
}
Das ist nicht ganz korrekt ist, weil nicht alle Listen der vom gleichen Typ sind. Aber es funktioniert, das einzige, was ich tun muss, ist eine Typumwandlung zu T
, wenn ich eine Double
zu einer Liste von Doubles oder String
zu einer Liste von Zeichenfolgen hinzufügen. Ich stelle sicher, dass jeder Typ nur zu Listen des richtigen Typs hinzugefügt wird.
Gibt es einen besseren Weg, um dieses Problem zu lösen? Die Alternative ist eine Map
für jede Art von List
zu haben. Aber das würde den Code nur hässlicher machen, und das einzige, was ich mit den Listen mache, ist sie zu sortieren und sie in einen DB als String-Werte einzufügen, daher rufe ich nur toString
über die Vergleichswerte an.
Sie verwenden ein [ 'checkedList'] (https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#checkedList-java.util.List- java.lang.Class-) um das Fehlerrisiko zu reduzieren. – shmosel
Da Sie dem Java-Compiler nicht statisch mitteilen können, welche Art von Elementen in der 'Liste' enthalten ist, können Sie nicht einmal sicherstellen, dass Elemente in einer der Listen miteinander vergleichbar sind. Kurz gesagt, Sie sollten dies entweder nicht tun oder akzeptieren, dass Sie die statische Typprüfung, z. indem Sie es als 'Map>' deklarieren, indem Sie den generischen Rohtyp 'Comparable' verwenden. Akzeptieren Sie dann die Compiler-Warnungen, in denen Ihnen mitgeteilt wird, dass Sie die statische Typprüfung umgehen. –
Andreas
@smosbel wow, wieso habe ich noch nie davon gehört? Danke :) – Roland