泛型类型的 Guava ClassToInstanceMap

Guava ClassToInstanceMap for generic types

我需要像 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
    }
}

不,无法使用 ClassToInstanceMap。您的示例代码使用了正确的方法;您将不得不使用不安全的地图并进行不安全的转换。