泛型类型的 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
。您的示例代码使用了正确的方法;您将不得不使用不安全的地图并进行不安全的转换。
我需要像 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
。您的示例代码使用了正确的方法;您将不得不使用不安全的地图并进行不安全的转换。