gpt4 book ai didi

java - 如何定义一个Map,其键和值强制具有相关的层次结构?

转载 作者:行者123 更新时间:2023-12-01 05:13:13 24 4
gpt4 key购买 nike

我有一个名为 Entity 的根类。我还有对实体的子类型执行 CRUD 操作的服务类。因此,我的服务类定义遵循这种模式

class Entity { 
//the root class
}

class Service<T extends Entity> {
//root service class containing common CRUD operations
}


class SomeEntity extends Entity {
}

class SomeService extends Service<SomeEntity> {
}

我维护一个实体类的映射 --> 到其相应的服务,例如

Map<Class<? extends Entity>, Service<? extends Entity>> = serviceMap
new HashMap<Class<? extends Entity>, Service<? extends Entity>>();

但是,上面的内容并不强制该类及其对应的 Service 属于同一层次结构。因此,即使在转换之后,我的客户端代码也必须再次转换它。如何避免以下情况?并在键和值之间强制执行严格的关系?

    public <T extends Entity> Service<T> get(Class<T> clazz) {
return (Service<T>) serviceMap.get(clazz);
}

//example of client code
SomeService service = (SomeService) serviceRegistry.get(SomeEntity.class);

最佳答案

不幸的是,你无法做你想做的事。这是不可能的!

但是,您实际上并不需要知道 Service 实现是什么。 Service 应该定义提供客户端代码调用的所有必要方法。你好,多态性!就我个人而言,我只需将您的 get 方法稍微更改为:

Service<? extends Entity> getService(Class<?> entityClass) {
return serviceMap.get(entityClass);
}

客户端代码不应该太关心实际的实现:

Service<? extends Entity> service = getService(SomeEntity.class);
service.save(myEntity);

另一种选择是,如果您知道需要服务时的实体类型是什么,那么您可以传入 Service 类并将其用于转换,例如:

<T extends Service<? extends Entity>> T getService(Class<?> entityClass, Class<T> serviceClass) {
return serviceClass.cast(serviceMap.get(entityClass));
}

诚然,上述方法都不能保证 SomeEntity.classMap 中的 SomeService 实例配对。

关于java - 如何定义一个Map,其键和值强制具有相关的层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11733237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com