Map<String, Integer> instance = new TreeMap<String, Integer>();
@SuppressWarnings("unchecked")
Map<String, Integer> map =
createMap((Class<? extends Map<String, Integer>>)instance.getClass());
map.put("x", 1);
System.out.println("THIS IS x: " + map.get("x"));
Będzie to odpowiednio wydrukować 1. Wykonanie metody jest najprawdopodobniej
try
{
return clazz.newInstance();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
Lepsze wdrażanie ich API byłoby dla nich, aby poprosić o rodzaju, T
, a dla im odsyłać wybrany przez siebie numer Map
zamiast prosić o wszystkie szczegóły. W przeciwnym razie, o ile nie są one wypełnieniu Map
z wszelkimi danymi, można instancji Map
z uniwersalnym typem argumentu sobie tak:
public static <T> Map<String, T> getMap()
{
return new TreeMap<String, T>();
}
Następnie można uzyskać dostęp, który bez ostrzeżenia:
// note the lack of type arguments, which are inferred
Map<String, Integer> instance = getMap();
// alternatively, you could do it more explicitly:
// Map<String, Integer> instance = ClassName.<Integer>getMap();
tam naprawdę nie ma powodu, dla nich prosić o rodzaju telefonu Map
wyjątkiem Class
aby oddać dokładne dopasowanie do wykonania (np jeśli trzymać w HashMap
, wtedy wrócić do HashMap
, a jeśli trzymasz się w TreeMap
, a następnie otrzymasz numer TreeMap
). Jednak podejrzewam, że TreeMap
straci wszystkie Comparator
, z których został zbudowany, a ponieważ jest to niezmienne (final
) pole TreeMap
, to nie można tego naprawić; oznacza to, że Map
nie jest taki sam w tym przypadku, ani nie jest prawdopodobne, że jest to, co chcesz.
Jeśli wypełniają dane Map
, ma to jeszcze mniejszy sens. Zawsze można przekazać wystąpienie Map
do wypełnienia lub poprosić o zwrócenie Map
, który można po prostu zawinąć (np. new TreeMap<String, Integer>(instance);
), i powinni wiedzieć, który z nich oferuje najwięcej użyteczności dla danych.
Nie można z powodu typu wymazać. W szczególności podpis metody nie ma sensu, ponieważ próbujesz uzyskać 'T', nawet jeśli bierzesz' Class' dla 'Map' z parametrem value jako' T'. Nigdy nie będziesz w stanie uzyskać typu zagnieżdżonego bez istniejącej instancji obiektu. (Mógłbyś przekazać '(nowy HashMap()). GetClass()', ale nadal nie będziesz w stanie odzyskać 'Integer' z tej metody). –
pickypg
Funkcja createMap() pochodzi z biblioteki, której używamy. Musi istnieć sposób na wywołanie tej metody. –
Pytam o zasadność zwróconego obiektu. Przypuszczalnie zwraca instancję parametru value, 'T', kiedy jest przekazywana w' Class' dla 'Map', a nazwa metody to' createMap'. Nic z tego nie ma sensu. – pickypg