具有多个类的上界 - Java泛型

时间:2013-06-26 21:31:51

标签: java generics map upperbound

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

 Map<Animal, List<TypeA/TypeB>>

我如何申报?我不能为上限指定两个类。

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

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

有更好的方法吗?

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

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

1 个答案:

答案 0 :(得分:3)

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

另一种方法是使用适配器。引用你们四人帮四本书:

  

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

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

interface Ab {
    void someOp();
}

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

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

地图可以使用适配器类型作为值。

Map<Animal, List<Ab>>

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