1

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

 Map<Animal, List<TypeA/TypeB>>

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

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

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

有更好的办法吗?

不能用接口包装 TypeA 和 TypeB。

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

4

1 回答 1

3

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

另一种方法是使用适配器。引用 ye olde Gang of Four 书:

将一个类的接口转换为客户期望的另一个接口。适配器让类一起工作,否则由于接口不兼容而无法工作。

所以在这里我们将介绍一个适配器类型(只有一个比这个更好的名字)。

interface Ab {
    void someOp();
}

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

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

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

Map<Animal, List<Ab>>

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

于 2013-06-26T21:35:52.763 回答