3

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

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

为此,我将 Map 声明为

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

以上编译。

为了填充地图,我使用了

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

这不编译。

我如何使这项工作?为什么不编译?

4

1 回答 1

5

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

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

这可能被描述为“serviceMap是从扩展类BaseService某种类型的值(它是BaseService或子类)的映射”。

register编译器在这种情况下 拒绝您的方法是正确的。serviceMap的值类型被声明为简单的“某物”——因此您可以轻松地为它分配一个值类型为ServiceImplOne. 并且您的 register 方法可以使用 class 的参数调用ServiceImplTwo。您不能将它插入到地图中,因为它与通用参数不一致!

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

Map<Class<? extends BaseService>, BaseService> serviceMap;
于 2012-07-30T11:04:15.533 回答