Zabawy z type erasure i pytanie

0

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ę.

1

Czemu nie:

public class Context {
    private final Map<Class<?>, Object> map = new HashMap<>();

    public Context() {
    }

    public Context(Context parent) {
        map.putAll(parent.map);
    }

    public void put(Object o) {
        map.put(o.getClass(), o);
    }

    public <T> Optional<T> get(Class<T> c) {
        return Optional.ofNullable(c.cast(map.get(c)));
    }

    void remove(Class<?> c) {
        map.remove(c);
    }

tylko jakieś cyrki ze stringami? o_O

1 użytkowników online, w tym zalogowanych: 0, gości: 1