在Map中存储抽象和具体类型

时间:2015-11-12 17:40:47

标签: java generics collections

我有一个接口和类如下:

public interface Message extends Wrappable
{
}

public class MessageImpl implements Message
{
}

我想使用Java泛型将这些类存储到Map中,接口为key,impl为value:

map.put(Message.class, MessageImpl.class);

我希望它是类型安全的,其中key必须扩展Wrappable,value必须扩展key类。 对此有何帮助?

1 个答案:

答案 0 :(得分:4)

基本Map无法安全地执行此类型,但您可以围绕Map创建一个简单的包装来强制执行类型安全。这可能看起来像

class MyMap {
  private final Map<Class<?>, Class<?>> map = new HashMap<>();
  public <A extends Wrappable, B extends A> void put(
      Class<A> interfaceClass, Class<B> implClass) {
    // you can't statically enforce that A is an interface 
    // and B is a concrete class, though you can do it at runtime
    assert interfaceClass.isInterface();
    assert !Modifier.isAbstract(implClass.getModifiers());
    map.put(interfaceClass, implClass);
  }

  public <A extends Wrappable> Class<? extends A> get(Class<A> interfaceClass) {
    return (Class<? extends A>) map.get(interfaceClass);
  }
}