我需要接受一个Map,它可以是TypeA或TypeB,如下所示。
Map<Animal, List<TypeA/TypeB>>
我该如何申报?我不能为上限指定两个类。
Map<Animal, List<? extends Object>> OR Map<Animal, List<Object>>
太宽了。我想把它限制在A型或B型
有更好的方法吗?
无法使用接口包装TypeA和TypeB。
编辑:从答案中,我明白,自定义类型是不可能的。后续问题是,如果我只使用<? extends Object>
,我应该如何检查的类型?是类型A或类型B。我应该使用instanceof吗?代码示例?
显而易见的解决方案是引入包含所需行为的TypeA
和TypeB
的超类型。
另一种方法是使用适配器。引用老四人帮的书:
将类的接口转换为客户端期望的另一个接口。适配器使类能够协同工作,否则由于接口不兼容而无法协同工作。
因此,在这里我们将介绍一种适配器类型(只有一个比它更好的名称)。
interface Ab {
void someOp();
}
然后我们可以包装现有的对象。
public static Ab asAb(final TypeA obj) {
return new Ab() {
public void someOp() {
obj.someOp();
}
};
}
映射可以使用适配器类型作为值。
Map<Animal, List<Ab>>
当我在现有代码中遇到这个问题时,这是因为映射实际上包含两个不相交的映射。简单的解决方案是使用两张地图。