Guava ClassToInstanceMap за общи типове

Трябва да поддържам java карта като Map<Class<? extends T>, Repository<T>> и да извлека екземпляра на хранилището без кастинг.

Най-близката реализация, която можах да намеря, е ClassToInstanceMap на Guava. Но изглежда поддържа само Map<Class<? extends T>, T>

Възможно ли е да се използва ClassToInstanceMap за представяне на Map<Class<? extends T>, Repository<T>> или има по-добър начин да се приложи това?

Ето пример, показващ грешката в кастинга при repositories.get(entityClass).save(entity);

// Entity types

interface Entity {
}

class Entity1 implements Entity {
}

class Entity2 implements Entity {
}

// Repositories

interface Repository<T extends Entity> {
    default void save(T entity) {};
}

class Entity1Repository implements Repository<Entity1> {
}

class Entity2Repository implements Repository<Entity2> {
}

public class Processor {

    private static Map<Class<? extends Entity>, Repository<? extends Entity>> repositories = new HashMap<>();

    public static void main(String[] args) {

        // Initialize map
        repositories.put(Entity1.class, new Entity1Repository());
        repositories.put(Entity2.class, new Entity2Repository());
    }

    public static void save(Class<? extends Entity> entityClass, Entity entity) {
        repositories.get(entityClass).save(entity); // Cast error
    }
}

person Jeeno Lentin    schedule 16.05.2020    source източник


Отговори (1)


Не, не е възможно да се използва ClassToInstanceMap. Вашият примерен код използва правилния подход; ще трябва да използвате небезопасна карта и да направите опасното кастиране.

person Louis Wasserman    schedule 16.05.2020
comment
Благодаря Ви за отговора. Да, изглежда, че трябва да направя гипс. - person Jeeno Lentin; 18.05.2020