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

标签 java generics collections

我有一个如下所示的接口(interface)和类:

public interface Message extends Wrappable
{
}

public class MessageImpl implements Message
{
}

我想使用 Java 泛型将这些类存储到一个 Map 中,其中接口(interface)为键,impl 为值:

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

我希望它是类型安全的,其中键必须扩展 Wrappable,值必须扩展键类。 有什么帮助吗?

最佳答案

基本的 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);
  }
}

关于java - 在 Map 中存储抽象类型和具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33677816/

相关文章:

java - 为什么Java List接口(interface)不支持getLast()?

c# - 从输入中计算字符时,在输出中获取空格字符

java - Spring IoC 和通用接口(interface)类型实现

java - 使用集合按顺序存储待处理的对象

java - 查找等待从 ArrayBlockingQueue 轮询的任务数量?

java - Hibernate 没有更新数据库记录

参数中未使用 Java 泛型返回类型

Scala,通用元组

java - 如何在没有 IDE 的计算机上运行 Java 程序?

java - 发送到数据库时 Android GPS 延迟