我需要接受一个可以是TypeA或TypeB的地图,如下所示。

 Map<Animal, List<TypeA/TypeB>>


我该如何声明?我不能为上限指定两个类。

 Map<Animal, List<? extends Object>> OR Map<Animal, List<Object>>


太宽了我想将其限制为TypeA或TypeB

还有更好的方法吗?

无法使用接口包装TypeA和TypeB。

编辑:
从答案中我了解到,使用自定义类型是不可能的。
后续问题是,如果我仅使用<? extends Object>,应该如何检查?是TypeA或TypeB。我应该使用instanceof吗?代码示例?

最佳答案

显而易见的解决方案是引入包含您所需行为的TypeATypeB的超类型。

另一种方法是使用适配器。引用《四本书》的旧版本:


  将类的接口转换为客户端期望的另一个接口。 Adapter使类可以协同工作,否则由于接口不兼容而无法实现。


因此,在这里我们将介绍一个适配器类型(仅使用比它更好的名称)。

interface Ab {
    void someOp();
}


然后,我们可以包装现有对象。

public static Ab asAb(final TypeA obj) {
    return new Ab() {
        public void someOp() {
            obj.someOp();
        }
    };
}


映射可以将适配器类型用作值。

Map<Animal, List<Ab>>


当我在现有代码中遇到此问题时,是因为该地图实际上包含两个不相交的地图。那里的简单解决方案是使用两个地图。

09-27 16:57