gpt4 book ai didi

java - 如何使用其键和值属于特定层次结构的通用映射?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:04 24 4
gpt4 key购买 nike

我的目标是创建一个 Map,其键是 Class 实例,其值是相应 Class 的实例。意思是,

Map(层次结构中的某个类 --> 其对应的实例)

为此,我将 Map 声明为

Map<Class<? extends BaseService>, ? extends BaseService> serviceMap = 
new HashMap<Class<? extends BaseService>, BaseService>();
//Assume BaseService is at the root of hierarchy.

以上编译。

为了填充 map ,我使用了

public <T extends BaseService> void register(T service) {   
serviceMap.put(service.getClass(), service);
}

这不会编译。

我该如何进行这项工作?为什么不能编译?

最佳答案

您对通配符的使用与您的英文定义不完全一致。当你定义:

Map<Class<? extends BaseService>, ? extends BaseService> serviceMap;

这可能被描述为“serviceMap 是从扩展 BaseService 的类到 某种类型 值(即 BaseService 或子类)"。

编译器在此上下文中拒绝您的 register 方法是正确的。 serviceMap 的值类型被声明为简单的“某物”——因此您可以轻松地为其分配一个值类型为 ServiceImplOne 的映射。您的 register 方法可以用类 ServiceImplTwo 的参数调用。您不能将其插入 map ,因为它与通用参数不一致!

很明显,由于您希望能够插入任何类型的服务, map 必须接受 BaseService 的所有实例作为值,而不是一些 BaseService 的(未知)子类型。因此,您可以通过使用具体值类型声明映射来解决此问题:

Map<Class<? extends BaseService>, BaseService> serviceMap;

关于java - 如何使用其键和值属于特定层次结构的通用映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720065/

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