Klasa Context (Map kluczowany typem - żaden tam EE Context).
Koncepcja tepletowanych typów nie kopie mnie tam, skąd się spodziewałem (przez type-erasure), ale z innych stron.
public class Context {
Map<String, Object> map = new HashMap<>();
public Context() {
}
public Context(Context parent) {
map.putAll(parent.map);
}
public void put(Object o) {
String tp = o.getClass().getCanonicalName();
map.put(tp, o);
}
public <T extends Object> Optional<T> get(Class<T> c) {
String tp = c.getCanonicalName();
return Optional.ofNullable(c.cast(map.get(tp)));
}
void remove(Class c) {
String tp = c.getCanonicalName();
map.remove(tp);
}
}
Testy:
public static void main(String[] args) {
Context ctx = new Context();
Car car = new Car("Ford");
Car[] cars = { car };
Person p = new Person("Smith");
Person[] persons = { p, new Person("Lee") };
ctx.put(persons);
ctx.put(cars);
ctx.put(car);
Optional<Car[]> p1 = ctx.get(Car[].class);
p1.isPresent(); // uniknięcie warningu "not used" - proszę nie bić.
}
I jestem dość zadowolony, działa, tylko BARDZO bym chciał inaczej pisać get. Nie ukrywam, moje tutaj myślenie jest trochę inspirowane C#.
/*Optional<Car[]> */ var p1 = ctx.get<Car[]>();
//mniemam uzyskany prez taką próbę (było ich więcej):
public <T extends Object> Optional<T> get<T>() {
String tp = c???.getCanonicalName(); --- Jak pobrać typ? Triki z refleksją?
return Optional.ofNullable(c.cast(map.get(tp)));
}
ale chyba się nie da?
Java 11, ale można podbić w górę.