泛型类型的Guava ClassToInstanceMap

问题描述 投票:0回答:1

我需要维护一个像Map<Class<? extends T>, Repository<T>>这样的Java映射并在不强制转换的情况下检索存储库实例。

我能找到的最接近的实现是Guava的ClassToInstanceMap。但它似乎只支持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
    }
}

我需要维护一个Java Map,例如Map ,Repository >,并在不进行转换的情况下检索存储库实例。我能找到的最接近的实现是番石榴的...

java collections guava
1个回答
0
投票

否,无法使用ClassToInstanceMap。您的示例代码使用正确的方法。您将不得不使用不安全的地图并进行不安全的投射。

© www.soinside.com 2019 - 2024. All rights reserved.