Zum Beispiel sagen, ich möchte eine Map<Class<?>, List<?>>
, also kann ich in eine Klasse und eine Liste von diesem Typ herausbringen - gibt es etwas, das ich die Fragezeichen ersetzen kann, um das zu ermöglichen?Wie erhält man einen Typ mit mehreren generischen Typen, um den Typparametern zu entsprechen?
Antwort
können Sie den Trick tun, wenn Sie Typprüfung der Methode delegieren:
private class TypedMap {
private Map<Class<?>, List<?>> map = new HashMap<>();
public <T> void put(Class<T> key, List<T> value) {
map.put(key, value);
}
@SupressWarnings("unchecked")
public <T> List<T> get(Class<T> clazz) {
return (List<T>) map.get(clazz);
}
}
Wildcard
?
in der Karte Erklärung stellt nicht sicher, dass die SchlüsselClass<?>
und WertList<?>
wäre vom gleichen Typ. Methodeput()
stellt sicher, dass. Sie können map nicht alsMap<Class<T>, List<T>>
deklarieren, wenn Ihre Klasse nicht generisch ist - deshalb müssen Sie eine Methode verwenden.Get-Methode ist deaktiviert. Die Besetzung ist sicher, wenn Einträge mit
put()
Methode hinzugefügt werden. (Es gibt immer noch ein Problem mit unformatierten Typen - aber das ist unvermeidbar)Sie können der TypeMap-Klasse weitere Methoden hinzufügen, aber beachten Sie diese Einschränkungen.
public static void main(String[] args) {
TypedMap map = new TypedMap();
List<Cat> cats = new ArrayList<>();
List<Dog> dogs = new ArrayList<>();
adder.put(Cat.class, cats);
adder.put(Dog.class, dogs);
adder.put(Cat.class, dogs); // compilation error
}
Nicht sicher, was Sie hier erreichen möchten, aber Map<Class<T>, List<T>>
wäre die nächste Sache. Die T
ist jedoch eine einzelne Klasse Typ, so dass Sie nicht mehrere Klassen in eine Map
setzen können.
Sie erhalten eine ClassCastException
, wenn Sie versuchen, Objekte verschiedener Klassen in die gleichen Map
zu setzen.
Java nicht vollständig diese durchzusetzen, sondern eine Möglichkeit, eine Warnung darüber zumindest zu erhalten, durch Verkapselung ist:
public class MyClass {
// private, private, private
private Map<Class<?>, List<?>> myMap;
public <T> void put(Class<T> clazz, List<T> list) { // both must have the same T.
myMap.put(clazz, list);
}
...
}
Sie können immer noch diese brechen, indem sie so etwas wie tun:
MyClass mc = new MyClass();
Class c = Main.class;
List<String> l = new ArrayList<String>();
mc.put(c, l);
Aber man zumindest wird eine Warnung über unkontrollierte Umwandlung von c
-Class<String>
erhalten. Und die unkontrollierte Aufruf von MyClass::put
- 1. Wie erhält man den Typ einer generischen Klasse mit mehreren Typparametern? - C#
- 2. Erweiterungsmethode für den generischen Typ mit zusätzlichen generischen Typparametern
- 3. Wie scala generischen Typ zu entsprechen?
- 4. Wiedergabe Schreibt mit generischen Typparametern
- 5. DynamicMethod mit generischen Typparametern
- 6. Scala: mit Typparametern oder abstrakte Typen als Typ
- 7. AppDomain.DoCallBack() mit mehreren generischen Typen Ausgabe
- 8. Typ eine Klasse mit generischen Typen Überprüfung
- 9. nameof mit generischen Typen
- 10. So geben Sie einen generischen Typ als generischen Typ an (höherwertige Typen)
- 11. Java Generics: wie man einen generischen Typ von einer Methode erhält?
- 12. Vorschlagswertprüfung mit generischen Typen
- 13. Regex, um einen JSON-String zu entsprechen
- 14. einen generischen Typ
- 15. Wie erhält man den Typ eines dynamischen Objekts in C#?
- 16. Verwenden Sie MOQ, um einen Typ mit generischen Parameter
- 17. Wie bekomme ich Regex, um mehreren Skript-Tags zu entsprechen?
- 18. Wie erhält man eine Aggregation nach Typ?
- 19. Regex, um Domain.CCTLD zu entsprechen
- 20. Wie man generischen Typ von der allgemeinen Definition und von den allgemeinen Argumenten erhält?
- 21. Wie man den Etikettehersteller erhält, um alles nicht zu fälschen?
- 22. Delphi: Wie man einen generischen Typ programmatisch erzeugt?
- 23. Wie spiegelt man Typen, die eine Schnittstelle von generischen haben, und erhalten diese Art von generischen
- 24. Wie erhält man einen einzelnen Wert aus mehreren auswählbaren Optionen?
- 25. Woher kennt MessageBodyReader den generischen Typ?
- 26. einen generischen Typ an eine Methode übergeben
- 27. Wie erhält man den Typ einer Abfrageanweisung in PDO?
- 28. Wie erhält man eine DataGridViewCheckBoxColumn, um den DataRelation-Status anzuzeigen?
- 29. Wie lade ich einen generischen Typ mit verschachtelten Typen aus dynamisch geladenen Assemblys?
- 30. den Typ eines generischen in delphi Testen
Wenn Sie „eine Liste dieser Art“ sagen, meinen Sie, dass die Listenelemente vom gleichen Typ wie die Klasse sind? –
Es ist nicht klar, was Sie anstellen. –
ist absolut klar, OP möchte eine Liste von Vögeln mit dem Bird.class Schlüssel und Liste von Katzen mit dem Cat.class Schlüssel speichern – AdamSkywalker