1

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

我能找到的最接近的实现是 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
    }
}
4

1 回答 1

1

不,不可能使用ClassToInstanceMap. 您的示例代码使用了正确的方法;您将不得不使用不安全的地图并进行不安全的演员表。

于 2020-05-16T06:09:34.363 回答