我可以让编译器忽略绑定不匹配错误吗? (或者修复它的这个实例)

时间:2011-12-15 15:45:43

标签: java generics

我有一个接口中定义的方法(我无法更改,它属于不同的项目),该接口使用泛型将输入类限制为扩展Class的类(后者实现接口),如这样:

<P extends ParentInterface, E extends P> void register(Class<E> cl, Class<P> parent);

当你正常调用它时,这很好用,但为了便于以这种方式注册潜在的大量类(并在需要时取消注册相同的集合),我希望将它们存储在{{ 1}}(或类似)并在注册/取消注册时循环它。不幸的是,这 - 可以预见 - 导致编译时错误,说明绑定不匹配:

Map<Class<? extends ParentInterface>, Class<? extends ParentInterface>>

我可以通过某种方式解决这个问题吗,还是我坚持做个别电话并确保我保持注册和取消注册呼叫同步?

2 个答案:

答案 0 :(得分:1)

是否有助于使类具有通用性, EDIT 不会封装但扩展Map接口?

public class TestMap <P extends ParentInterface, E extends P> extends HashMap implements Map {
    void registerall(){
        Class<E> key = (Class<E>) this.keySet().iterator().next();
        Class<P> val = (Class<P>) this.get(key);
        register(key, val);
    }

}

答案 1 :(得分:1)

当(联合国)注册时,只需使用通配符捕获和asSubclass(Class)

Class<? extends ParentInterface> parent = entry.getValue();
Class<? extends ParentInterface> child = entry.getKey();
registerWithCapturedParent(parent, child);

private <P extends ParentInterface> void registerWithCapturedParent(Class<P> parent,
    Class<? extends ParentInterface> child) {
    Class<? extends P> boundedChild = child.asSubclass(parent);
    registry.register(boundedChild, parent);
}